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 »"GR-PA"«
Diese Fehlermeldung liegt daran, dass Unicode-Zeichen (auch als breite Zeichen bezeichnet) doppelt soviel Speicher belegen, wie Multi-Byte Zeichen.
Zitat von »"Deviloper"«
Naja kommt darauf an ... mein es war MSVC++ der nicht vollständig UNICODE drin hat ... in MSVC++ wird wchar_t meine ich als unsigned short definiert ... bin mir aber nicht ganz sicher ...(4Byte auf jedenfall ..)
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?
Zitat von »"GR-PA"«
Hier kommmt nun ein Makro ins Spiel, das in WinDef.h definiert ist. Da WinDef.h von windows.h eingebunden wird, muss man also keine weiteren Headerdateien einbinden. Das Makro setzt je nachdem, ob Unicode Definiert ist ein L vor den String oder nicht. Das Makro wird wie folgt verwendet:
C-/C++-Quelltext
1TEXT("Text")
Also muss man einfach immer, wenn eine Funktion eine Unicode und eine Multi-Byte Variante hat den Text über das Makro TEXT übergeben und schon ist man alle Probleme mit Unicode los und kann die Vorteile die der erweiterte Zeichensatz bietet in vollen Zügen ausnutzen.
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?
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 ); |
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 ); |
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 ); |
Zitat von »"David_pb"«
C-/C++-Quelltext
1 2 3 4 5 6 7 const wchar_t* str1 = L"Hallo Welt"; char buffer[255] = {0}; if ( std::use_facet< std::ctype<wchar_t> >(std::cout.getloc()).narrow(str1, str1 + wcslen(str1), '?', buffer) == 0 ) printf( "widechar to multibyte encoding failed" ); else printf( "encoding succeeded: %s\n", buffer );
Werbeanzeige