Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

problem z polskimi znakami

Ostatnio zmodyfikowano 2016-05-03 13:29
Autor Wiadomość
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
C/C++
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ć   
P-147870
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
P-147874
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.
P-147876
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.
P-147877
kamkam
Temat założony przez niniejszego użytkownika
» 2016-05-02 16:21:09
C/C++
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" );
P-147879
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.

C/C++
setlocale( LC_CTYPE, ".852" ); //<-- gdzieś na początku main, windows only. W przypadku MinGW użycie wcout.imbue odpada.

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.
P-147882
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++.
P-147903
michal11
» 2016-05-03 12:42:12
uzyj std::wstring
P-147904
« 1 » 2
  Strona 1 z 2 Następna strona