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 :)) std::wstring str = L""; std::wifstream infile; infile.open( path.c_str() ); if( infile ) { std::wstring s = L""; while( getline( infile, s ) ) { str += s; str += L"\n"; } }
txtInput = new TextInput( 100, 100, 500, 500, sf::Text( str, sty->font, 10 ) );
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 |
|
MrPoxipol |
» 2014-05-01 17:22:48 |
|
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ę |
|
anonim Temat założony przez niniejszego użytkownika |
» 2014-05-01 18:02:13 Ok, gotowe: 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 ); }
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! |
|
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. |
|
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. |
|
« 1 » |