[C++] Polskie znaki

0

Czy zna ktoś łatwiejszy sposób, by konsola wyświetlała polskie znaki, niż ten?

     char pz1, pz2;
     pz1 = 152;  //ś
     pz2 = 134;  //ć 

     cout << "Cze" << pz1 << pz2;

Rezultat:
Cześć

Robię program, który wymaga polskich znaków, ale przypisywanie nowych wartości zmiennym trochę przedłuża mi pracę...

0

Może stworzenie odpowiedniego makra rozwiązało by problem, mianowicie makro to miało by analizować kod programu, wyszukiwać polskie znaki i podmieniać je na odpowiednie stałe. Nie wiem jak coś takiego napisać ale może komuś sie uda...

PS. z tego co wiem to cierpliwość w programowaniu jest jedną z podstaw ;-)

0

mozesz pisac normalnie, np. "żółty" i wyswietlac to cout'em. jesli po czyms takim w konsoli zamiast znakow narodowych wyswietlaja sie krzaki, to znaczy ze masz nieprawidlowo ustawione locale -- w standardowej bibliotece C++ jest zestaw funkcji ktore pozwalaja ustawic strumien aby korzystal z danego kodowania, o ile pamietam jest to metoda imbue, np. cout.imbue(..cos..) i juz masz ustawione PL-pl.. poza tym, chyba najbezpieczniej jest po prostu korzystac z unicode, czyli widestringow:

#define UNICODE
#include <iostream>
#include <wstring>

std::wstring uni_napis = L"zażółć gęślą jaźń";
std::wcout << uni_napis << endl;

@kod - cos w tym stylu. string!=wstring. string bazuje na char, wstring na wchar_t. L"napis" to nie blad - w ten sposob oznacza sie cstringi const wchar_t zamiast const char

0

Hmm.. Jesteś pewien, czy ten kod jest właściwy? Bo mój kompilator ma zastrzeżenia do wcout (używam Dev-C++)

Najpierw mi pisze, że wcout nie należy do std, a po usunięciu std że jest nie zadeklarowany...

0

tak jak mowilem kod jest mniej-wiecej.. aktualnie probuje przygotowac poprawny przyklad..

przykaldowo:

#include <iostream>
#include <locale>
#include <string>

int main()
{   using namespace std;
    cout.imbue(locale("pl_PL"));
    string name = cout.getloc().name();
    cout << "locale=" << name << endl;

    string napis = "zażółć gęślą jaźń";
    cout << napis.size() << endl;
    cout << napis << endl;
    return 0;
}

na gcc/G++: gcc version 3.3.6 (PLD Linux) tworzy wyjscie:

locale=pl_PL
17
zażółć gęślą jaźń

a wiec idealnie: 17 znakow w stringu, napis wypisany.. jesli wypisze krzaki - to znaczy ze system nieprawilowo obsluguje pl_PL ---- acz wtedy powinien rzucic wyjatkiem podczas imbue(locale("pl_PL

natomiast uparlem sie z widestringami..:

#include <iostream>
#include <locale>
#include <string>

int main()
{   using namespace std;
    wcout.imbue(locale("pl_PL"));
    string name = wcout.getloc().name();
    cout << "locale=" << name << endl;

    wstring napis = L"zażółć gęślą jaźń";
    wcout << napis.size() << endl;
    wcout << napis << endl;
    if(!wcout){wcout.clear();wcout << "streamput failed" <<endl;}
    return 0;
}

wyrzuca:

locale=pl_PL
17
zastreamput failed

i do prawdy nie wiem czemu.. widestring ma tez 17 znakow, czyli nic nie zostalo uciele. natomiast proba wrzucenia znaku L'ż' na wcout, powoduje wejscie w stan FAIL.. no i na razie na tym fakcie utknalem. w kazdym badz razie jak widac sam wstring dziala - problem za pewne lezy w ustawieniu locale i charsetu

0

Problem tkwi jedynie w edytorze i zastosowaniu odpowiedniego kodowania znaków. Na razie pisz sobie w dev'ie normalnie i nie przejmuj się, że w konsoli wyskakują krzaczki. Jak skończysz pisać program to otwórz go w jakimś edytorze tekstowym pozwalającym na zmianę kodowania (np. PSPAd jest fajny). Zmień kodowanie znaków na OEM i zapisz. Ponownie otwórz w dev'ie, tym razem tu zobaczysz krzaczki, ale po kompilacji w konsoli ujrzysz polskie ogonki.

0

ś jest tak

char a='\230'

ściana tak

cout<<"\230ciana";

i tak dalej

0

Można skorzystać z funkcji, która zmienia kod podanych polskich znaków na odpowiednie znaki z tablicy ACII. Działa równie dobrze.

std::string PL(std::string Znak)
{
       for (int i = 0; i < Znak.length(); i ++)
       {
               switch(Znak[i])
               {
                       case 'ą':
                               Znak[i] = static_cast<char>(165);
                       break;

                       case 'ć':
                               Znak[i] = static_cast<char>(134);
                       break;

                       case 'ę':
                               Znak[i] = static_cast<char>(169);
                       break;

                       case 'ł':
                               Znak[i] = static_cast<char>(136);
                       break;

                       case 'ń':
                               Znak[i] = static_cast<char>(228);
                       break;

                       case 'ó':
                               Znak[i] = static_cast<char>(162);
                       break;

                       case 'ś':
                               Znak[i] = static_cast<char>(152);
                       break;

                       case 'ź':
                               Znak[i] = static_cast<char>(171);
                       break;

                       case 'ż':
                               Znak[i] = static_cast<char>(190);
                       break;

                       case 'Ą':
                               Znak[i] = static_cast<char>(164);
                       break;

                       case 'Ć':
                               Znak[i] = static_cast<char>(143);
                       break;

                       case 'Ę':
                               Znak[i] = static_cast<char>(168);
                       break;

                       case 'Ł':
                               Znak[i] = static_cast<char>(157);
                       break;

                       case 'Ń':
                               Znak[i] = static_cast<char>(227);
                       break;

                       case 'Ó':
                               Znak[i] = static_cast<char>(224);
                       break;

                       case 'Ś':
                               Znak[i] = static_cast<char>(151);
                       break;

                       case 'Ź':
                               Znak[i] = static_cast<char>(141);
                       break;

                       case 'Ż':
                               Znak[i] = static_cast<char>(189);
                       break;
               }
       }
       return Znak;
}

W wywołaniu funkcji pomiędzy "" wpisujemy napis, w którym występują polskie znaki.
Przykład zastosowania:

std::cout << PL("Kółko i krzyżyk");
0

Oj oj oj , po co takie komplikacje. Problem jest banalny. po prostu dla dev'a literka ś ma kod 156, a w konsoli ś to 152. Po co sie męczyć z jakimiś nic nie mówiącymi liczbami itp. Pisz w devie sobie normalnie śćź, po skończeniu konwersja na właściwe kodowanie i tyle. zero problemów.

0
quetzalcoatl napisał(a)

natomiast uparlem sie z widestringami..:
[...]
i do prawdy nie wiem czemu.. widestring ma tez 17 znakow, czyli nic nie zostalo uciele. natomiast proba wrzucenia znaku L'ż' na wcout, powoduje wejscie w stan FAIL.. no i na razie na tym fakcie utknalem. w kazdym badz razie jak widac sam wstring dziala - problem za pewne lezy w ustawieniu locale i charsetu

wcout.imbue(locale(".OCP"));

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0