10 Stimmen

WinAPI- und UTF-8-Unterstützung

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

11voto

Andrew Grant Punkte 57342

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;

http://www.joelonsoftware.com/articles/Unicode.html

2 Stimmen

Nur ein bisschen Terminologie, aber es heißt UTF-16. So etwas wie Unicde-16 gibt es nicht :)

4 Stimmen

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.

1 Stimmen

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.

6voto

Mark Punkte 6117

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.

1 Stimmen

+1 mit wenig Erbsenzählerei: Die W-Version ist UTF-16, nicht UCS-2 - sie verarbeitet auch Surrogatpaare.

4voto

Rob Punkte 72944

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.com

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.

Powered by:

X