2009-04-06 8 views
3

einige Funktionen Beim Testen Strings zwischen wchar_t und UTF-8-I mit Visual C erfüllt die folgende seltsame Ergebnis zu konvertieren ++ Express 2008Unerwartete Ausgabe von std :: wcout << L "elève"; in Windows Shell

std::wcout << L"élève" << std::endl; 

druckt „ÚlÞve:“ was natürlich nicht der Fall ist, was erwartet wird.

Dies ist offensichtlich ein Fehler. Wie kann das sein ? Wie soll ich mit einem solchen "Feature" umgehen?

Antwort

12

Der C++ - Compiler unterstützt Unicode in Codedateien nicht. Sie müssen diese Zeichen stattdessen durch ihre maskierten Versionen ersetzen.

Versuchen Sie folgendes:

std::wcout << L"\x00E9l\x00E8ve" << std::endl; 

Auch Ihre Konsole als auch Unicode unterstützen muss.

UPDATE:

Es ist nicht die gewünschte Ausgabe in Ihrer Konsole produzieren gehen, da die Konsole Unicode nicht unterstützt.

+0

Leider ist die Interpretation, Daves Code Ausbeuten unter Verwendung genau die gleiche Leistung . Also ich denke, es bedeutet, dass die Shell Unicode nicht unterstützt. – chmike

+0

Es scheint, dass ich in der Lage sein sollte, die UTF-8-Unterstützung in der Shell zu aktivieren, indem ich den Befehl chcp 65001 austrage. Wie kann ich dies innerhalb eines Programms tun, bevor ich etwas schreibe? – chmike

+0

Es wird nicht die volle UTF-16 ausgeben. Sie haben Glück, wenn Sie eine ANSI-Ausgabe erhalten, weil die höherwertigen Bytes abgeschnitten werden. Aber die Zeichen sind ANSI Seite 1252 kompatibel. –

1

Sie können auch einen Blick auf this question werfen. Es zeigt, wie Sie tatsächlich Unicode-Zeichen in Dateien mit einigen Compilern fest codieren können (ich bin nicht sicher, welche Optionen MSVC hätten).

0

Sie IDE und der Compiler verwenden, um die Codepage ANSI. Die Konsole verwendet die OEM-Codepage.

Es ist auch wichtig, was machst du mit diesen Konvertierungsfunktionen.

1

Dies ist offensichtlich ein Fehler. Wie kann das sein?

Während andere Betriebssysteme mit älteren Zeichenkodierungen verteilt sind und eingeschaltet in UTF-8, verwendet Windows zwei legacy Codierungen: Eine „OEM“ Codeseite (an der Eingabeaufforderung verwendet wird) und ein „ANSI“ -Code Seite (wird von der GUI verwendet).

Ihre C++ Quelldatei ist in ANSI-Codepage 1252 (oder möglicherweise 1254, 1256 oder 1258), aber die Konsole als OEM-Codepage 850.