Kurze Frage zur UTF-8-Unterstützung und verschiedenen Win32-APIs.
Ist es in einem typischen C++-MFC-Projekt möglich, dass MessageBox() eine UTF-8-kodierte Zeichenfolge anzeigt?
Danke, Andrew
Kurze Frage zur UTF-8-Unterstützung und verschiedenen Win32-APIs.
Ist es in einem typischen C++-MFC-Projekt möglich, dass MessageBox() eine UTF-8-kodierte Zeichenfolge anzeigt?
Danke, Andrew
Schnelle Antwort: Nein.
Längere Antwort: Es wird funktionieren, wenn die Zeichenfolge nur reguläre ANSI-Zeichen enthält, z. B. US-Englisch, da diese Zeichencodes in UTF-8 und ANSI gleich sind.
Wenn nicht-ANSI-Zeichen oder Doppelbyte-kodierte Zeichen enthalten sind, müssen Sie diese mit MultiByteToWideChar und CP_UTF8 in Unicode-16 umwandeln. Ihr Programm muss außerdem mit definiertem UNICODE kompiliert werden, oder Sie können die "W"-API-Aufrufe verwenden - z. B. MessageBoxW.
(Beachten Sie, dass Funktionen, die ein Textargument annehmen, wie MessageBox, CreateWindow, entweder der 'A'- oder der 'W'-Version entsprechen, je nachdem, ob UNICODE definiert ist).
Dies kann ebenfalls von Nutzen sein;
Nur ein bisschen Terminologie, aber es heißt UTF-16. So etwas wie Unicde-16 gibt es nicht :)
Dieser Artikel von Joel ist schon ziemlich alt, und er spielt UTF-8, die technisch am besten geeignete Unicode-Kodierung, wirklich herunter. Seine eigenen Ideen zum Auffinden des HTML-Meta-Tags funktionieren nur mit UTF-8 oder einer (von ASCII abgeleiteten) Einzelbyte-Kodierung. Andernfalls erhält man überall nullwertige Bytes, was die Suche nach '<'-Zeichen schwierig macht. In UTF-8 können Sie XML (und HTML) parsen, ohne sich um Unicode kümmern zu müssen, da es garantiert, dass Sie Bytes < 127 nur dann sehen, wenn sie tatsächliche ASCII-Zeichen kodieren.
Beachten Sie auch, dass ein Großteil der WinAPI ist eigentlich mehr wie UCS-2, anstatt UTF-16, in dem zumindest einige Teile der WinAPI (welche? Ich habe keine Ahnung - es scheint alles eher hit & miss) wird nicht behandeln Surrogat-Paare richtig; mit anderen Worten, sie werden davon ausgehen, dass UTF-16 eine feste Breite Codierung ist.
Nein, verwenden Sie MultiByteToWideChar con CP_UTF8
. Siehe http://www.siao2.com/2006/10/11/816996.aspx warum A es nicht tun kann; W (UCS-2) ist die einzige Alternative.
Ich verwende die ATL/MFC-Makros zur String-Konvertierung. Wenn Sie zum Beispiel eine ASCII-Zeichenkette mit dem Namen myUTF8Str
die UTF8-Zeichen enthalten:
::MessageBox(hWnd, CA2T(myUTF8Str, CP_UTF8), _T("Caption"), MB_OK);
Alternativ können Sie auch eine Instanz der Zeichenkette erstellen, z. B.:
CA2T myConvertedString(myUTF8Str, CP_UTF8);
...
TRACE(_T("Converted: %s\n"), myUTF8Str.m_psz);
Beachten Sie die m_psz
Mitglied, das den Nur-Lese-Zugriff auf den Raw-String-Zeiger ermöglicht.
Sie können auch kodieren mit CT2A
, z.B.:
CT2A myEncodedString("Some UTF8", CP_UTF8);
Wenn Sie keine TEXT-Makros verwenden, dann verwenden Sie CA2W, CW2A, etc.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.