kamkam Temat założony przez niniejszego użytkownika |
problem z polskimi znakami » 2016-05-02 14:32:34 Witam od dłuższego czasu w c++ tworze grę tekstową, i jako że jest ona po polsku to potrzebowałem na to solucji na bodajże tym forum znalazłem coś takiego std::string PL( const char * text ) { std::string result; for(; * text; text++ ) switch( * text ) { case 'ą': result += static_cast < char >( 0xa5 ); break; case 'ć': result += static_cast < char >( 0x86 ); break; case 'ę': result += static_cast < char >( 0xa9 ); break; case 'ł': result += static_cast < char >( 0x88 ); break; case 'ń': result += static_cast < char >( 0xe4 ); break; case 'ó': result += static_cast < char >( 0xa2 ); break; case 'ś': result += static_cast < char >( 0x98 ); break; case 'ż': result += static_cast < char >( 0xbe ); break; case 'ź': result += static_cast < char >( 0xab ); break; case 'Ą': result += static_cast < char >( 0xa4 ); break; case 'Ć': result += static_cast < char >( 0x8f ); break; case 'Ę': result += static_cast < char >( 0xa8 ); break; case 'Ł': result += static_cast < char >( 0x9d ); break; case 'Ń': result += static_cast < char >( 0xe3 ); break; case 'Ó': result += static_cast < char >( 0xe0 ); break; case 'Ś': result += static_cast < char >( 0x97 ); break; case 'Ż': result += static_cast < char >( 0xbd ); break; case 'Ź': result += static_cast < char >( 0x8d ); break; default: result += * text; break; } return result; }
i wszystko ładnie działało i w konsoli i pliku źródłowym, dziwne rzeczy zaczęły się dziać kiedy zacząłem pracować na więcej niż jednym pliku(projekt tak się rozrósł że inaczej bym go nie opanował) i tutaj zaczęło być bardzo dziwnie ponieważ najpierw nie działało wcale potem zadziałało a teraz wszystkie polskie znaki w wszystkich innych plikach prócz .cpp zamieniły się na krzaczki, które o dziwo na początku działały w konsoli ale po zamienieniu jednego krzaczka wszystko przestało działać |
|
carlosmay |
» 2016-05-02 15:08:38 Można skorzystać z std::wstring , <locale> (ctype, codecvt). std::wcout.imbue( kod ) . Sposobów jest kilka (niektóre zależą od kompilatora lub systemu). Co by to nie było, problemem są błędy w kodzie. Jakiego sposobu by nie użyć, trzeba dobrze zarządzać konwertowaniem. Przykład: http://cpp0x.pl/forum/temat/?id=22532 |
|
kamkam Temat założony przez niniejszego użytkownika |
» 2016-05-02 15:42:10 Muszę się przyznać że nie mam zielonego pojęcia o czym mówisz, i proszę o sposób bardziej idiotoodporny. do tego może sprecyzuje bo polskie znaki działają mi w głównym pliku (cpp) jednak nie działają nigdzie indziej, chociaż że działały przed tym jak zmieniłem krzaczki z powrotem na polskie znaki. |
|
carlosmay |
» 2016-05-02 16:04:24 do tego może sprecyzuje bo polskie znaki działają mi w głównym pliku (cpp) jednak nie działają nigdzie indziej |
Precyzowanie nic nie daje. Robisz błąd i nie wiem jaki. Wklej fragment kodu, który nie działa. |
|
kamkam Temat założony przez niniejszego użytkownika |
» 2016-05-02 16:21:09 system( "cls" ); cout << PL( "Już z oddali widzisz wielką jabłoń, pełną owoców. Stoi przy niej dwóch typowych, obdartych wieśniaków, \n" ); cout << PL( "którzy za¿arcie siê k³óc¹. Gdy podchodzisz, jeden z nich szybko odzywa siê do ciebie:\n" ); cout << PL( "- Panie, prawda, ¿e ja, Ung, syn Dunga, mam racjê w tym sporze, a ten idiota Bung jak zwykle siê myli? \n" ); cout << PL( " 1. Jasne, Ung, masz ca³kowit¹ racjê. \n" ); cout << PL( " 2. W³aœciwie to mam wra¿enie, ¿e to Dung ma racjê.\n" ); cout << PL( " 3. Ale o co tu w³aœciwie chodzi? \n" );
|
|
j23 |
» 2016-05-02 18:33:53 Problem polega na tym, że windowsowa konsola działa w kodowaniu CP-852, z kolei wszelkie IDE na ogół wykorzystują domyślnie kodowanie windowsowe - czyli dla polskiej wersji będzie to CP-1250. Dlatego, żeby wszystko dobrze się wyświetlało powinieneś swoją aplikację kompilować w kodowaniu CP-852. Inna opcja to użycie, jak wspomniał carlosmay, unikodowych strumieni. Minus tego jedynie taki, że wszystko musisz pisać w unikodzie. setlocale( LC_CTYPE, ".852" );
std::wcout << L"Już z oddali widzisz wielką jabłoń, pełną owoców. Stoi przy niej dwóch typowych, obdartych wieśniaków, \n"; std::wcout << L"którzy zażarcie siê kłócą. Gdy podchodzisz, jeden z nich szybko odzywa się do ciebie:\n"; std::wcout << L"- Panie, prawda, że ja, Ung, syn Dunga, mam rację w tym sporze, a ten idiota Bung jak zwykle się mylił \n"; std::wcout << L" 1. Jasne, Ung, masz całkowitą rację. \n"; std::wcout << L" 2. Właściwie to mam wrażenie, że to Dung ma rację.\n"; std::wcout << L" 3. Ale o co tu właściwie chodzi? \n"; ps. pliki źródłowe dobrze jest zapisywać w uft-8 z BOM-em. |
|
kamkam Temat założony przez niniejszego użytkownika |
» 2016-05-03 12:24:27 j23 użyłem twojego pomysłu i wszystko działa, za co dziękuje ale mam jeszcze jeden problem brzmiący: czy da się zapisać polskie znaki w stringu, i poraz kolejny proszę o jak bardziej idioto odporny język bo nie jestem Jeszce zaawansowany w c++. |
|
michal11 |
» 2016-05-03 12:42:12 uzyj std::wstring |
|
« 1 » 2 |