Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat von »"David_pb"«
Zitat von »"Beneroth"«
öhm, alles ganz schön ABER...
hat C++ selber neben dem Dateityp auch ne Funktion zum transcodieren? Oder muss ich die selber schreiben?
Es ist ein Datentyp. Was meinst du mit transcodieren? Das Umwandeln von wchar_t in char, und umgekehrt? Dann gibt es einige Funktionen.
Zum Beispiel (CRT => Microsoftspezifisch aber sicherer Equivalent zu wcsrtombs: wcsrtombs_s):
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 mbstate_t mbstate; const wchar_t* str1 = L"Hallo Welt"; char buffer[255] = {0}; memset((void*)&mbstate, 0, sizeof(mbstate)); wcsrtombs(buffer, &str1, 255, &mbstate); if ( errno > 0 ) printf( "widechar to multibyte encoding failed" ); else printf( "encoding succeeded: %s\n", buffer );
Oder (WinAPI):
C-/C++-Quelltext
1 2 3 4 5 6 7 const wchar_t* str1 = L"Hallo Welt"; char buffer[255] = {0}; if ( !WideCharToMultiByte(CP_UTF8, 0, str1, -1, buffer, 255, 0, 0) ) printf( "widechar to multibyte encoding failed" ); else printf( "encoding succeeded: %s\n", buffer );
Oder (C++ Standard Library):
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 const wchar_t* str1 = L"Hallo Welt"; char buffer[255] = {0}; #if defined(_MSC_VER) && _MSC_VER < 1000 using std::use_facet; if ( _USE( std::cout.getloc(), std::ctype<wchar_t> ).narrow(str1, str1 + wcslen(str1), '?', buffer) == 0 ) #else if ( std::use_facet< std::ctype<wchar_t> >(std::cout.getloc()).narrow(str1, str1 + wcslen(str1), '?', buffer) == 0 ) #endif printf( "widechar to multibyte encoding failed" ); else printf( "encoding succeeded: %s\n", buffer );
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
#if _UNICODE #define Convert DeineCharToWCharFunktionalitaet #else #define Convert #endif // ... std::wstring str = Convert( Foobar() ); |
Zitat von »"David_pb"«
Alles immer umzuwandeln halte ich eigentlich eher für Suboptimal. Da das viel zu viel Zusatzaufwand bedeutet.
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <locale> #include <cassert> #include <vector> template< typename D, typename S > inline std::basic_string< D > uni_cast( const S* const src, const std::locale& locale = std::locale() ) { return src; } template<> inline std::basic_string< char > uni_cast( const wchar_t* const src, const std::locale& locale ) { assert( src != NULL ); #if defined( _MCS_VER ) && _MSC_VER < 1000 using namespace std; \ const std::ctype< wchar_t >* ctype = &_USE( locale, ctype< wchar_t > ) #else const std::ctype< wchar_t >* ctype = &std::use_facet< std::ctype< wchar_t > >( locale ); #endif const std::basic_string< wchar_t >::size_type len = std::char_traits< wchar_t >::length( src ); std::vector< char > tmp( len ); ctype->narrow( src, src + len, '?', &tmp[ 0 ] ); return std::basic_string< char >( &tmp[ 0 ], len ); } template<> inline std::basic_string< wchar_t > uni_cast( const char* const src, const std::locale& locale ) { assert( src != NULL ); #if defined( _MCS_VER ) && _MSC_VER < 1000 using namespace std; \ const std::ctype< wchar_t >* ctype = &_USE( locale, ctype< wchar_t > ) #else const std::ctype< wchar_t >* ctype = &std::use_facet< std::ctype< wchar_t > >( locale ); #endif const std::basic_string< char >::size_type len = std::char_traits< char >::length( src ); std::vector< wchar_t > tmp( len ); ctype->widen( src, src + len, &tmp[ 0 ] ); return std::basic_string< wchar_t >( &tmp[ 0 ], len ); } |
Werbeanzeige