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

SFML wczytywanie polskich znaków z pliku

Ostatnio zmodyfikowano 2014-05-01 21:42
Autor Wiadomość
anonim
Temat założony przez niniejszego użytkownika
SFML wczytywanie polskich znaków z pliku
» 2014-05-01 15:57:13
Cześć

Mam taki kod odpowiedzialny za wczytanie tekstu z pliku i wyświetlenie go na kontrolce TextInput (widget własnej produkcji :))
C/C++
std::wstring str = L"";
std::wifstream infile;
infile.open( path.c_str() ); // open file
if( infile ) {
    std::wstring s = L"";
    while( getline( infile, s ) ) {
        str += s;
        str += L"\n";
    }
}
//std::wcout << str << "\n";
txtInput = new TextInput( 100, 100, 500, 500, sf::Text( str, sty->font, 10 ) ); //sty-> font to czcionka

Problemem są polskie znaki. Tzn kiedy plik zawiera np:  ą,ć,ę,ł,ń,ó,ś,ź,ż ; to w widgecie wyświetlane są 'krzaki'.
Jeżeli podmienię to na:
txtInput = new TextInput( 100, 100, 500, 500, sf::Text( L"ą,ć,ę,ł,ń,ó,ś,ź,ż", sty->font, 10 ) );
to działa.

Wobec tego wydaje mi się, że problem jest gdzieś w kodowaniu pliku. Próbowałem go kodować na wiele sposobów (UTF-8, ISO-8859-2) przy pomocy notepad++, ale nic to nie dało

Proszę o pomoc
P-109033
MrPoxipol
» 2014-05-01 17:22:48
http://stackoverflow.com/a​/7066229/2221315
To też się może przydać: http://www.sfml-dev.org​/documentation/2.0​/classsf_1_1String.php
Niestety nie przetestuję, bo musiałbym konfigurować SFMLa (nie chce mi się, a i tak nie używam ostatnio).
P-109034
anonim
Temat założony przez niniejszego użytkownika
» 2014-05-01 17:49:01
czyli generalnie chodzi o to, że wczytuje całość jako std::string (UTF-8), i zamieniam go na std::wstring(UTF-16) ?
Bo już się gubię
P-109038
anonim
Temat założony przez niniejszego użytkownika
» 2014-05-01 18:02:13
Ok, gotowe:

C/C++
std::wstring multiByteToWideString( const char * szSrc )
{
    unsigned int iSizeOfStr = MultiByteToWideChar( CP_ACP, 0, szSrc, - 1, NULL, 0 );
    wchar_t * wszTgt = new wchar_t[ iSizeOfStr ];
    if( !wszTgt ) assert( 0 );
   
    MultiByteToWideChar( CP_ACP, 0, szSrc, - 1, wszTgt, iSizeOfStr );
    std::wstring wstr( wszTgt );
    delete( wszTgt );
    return( wstr );
}

std::string wideStringToMultiByte( const wchar_t * wszSrc )
{
    int iSizeOfStr = WideCharToMultiByte( CP_ACP, 0, wszSrc, - 1, NULL, 0, NULL, NULL );
    char * szTgt = new char[ iSizeOfStr ];
    if( !szTgt ) return( NULL );
   
    WideCharToMultiByte( CP_ACP, 0, wszSrc, - 1, szTgt, iSizeOfStr, NULL, NULL );
    std::string str( szTgt );
    delete( szTgt );
    return( str );
}

//i dalej:
txtInput = new TextInput( 100, 100, 500, 500, sf::Text( multiByteToWideString( str.c_str() ), sty->font, 10 ) );

Szkoda tylko, że traci to na multiplatformowości, ale trudno.
Wielkie dzięki!
P-109043
MrPoxipol
» 2014-05-01 20:40:59
Nie jestem pewien, ale chyba sf::String sobie z tym radzi.

PS Nie używaj asercji w kodzie końcowym.
P-109064
Piotr020798
» 2014-05-01 21:42:48
Zobacz mój stary temat http://cpp0x.pl/forum/temat/?id=13784
Na końcu jest rozwiązanie.
P-109071
« 1 »
  Strona 1 z 1