Ich habe Microsoft Visual Studio 2010 unter Windows 7 64bit. (In den Projekteigenschaften ist "Zeichensatz" auf "Nicht festgelegt" gesetzt, jedoch führt jede Einstellung zur gleichen Ausgabe.)
Quellcode:
%Vor% * 1: Das Einschließen von windows.h
vermasselt die Dinge, also nehme ich es aus einer separaten cpp auf.
Die kompilierte Binärdatei enthält die Zeichenfolge als korrekte UTF-8-Bytefolge. Wenn ich die Konsole mit chcp 65001
und Ausgabe type main.cpp
auf UTF-8 setze, wird die Zeichenfolge korrekt angezeigt.
Test (Konsole zur Verwendung der Lucida Console-Schriftart):
%Vor% Was ist die Erklärung dahinter? Kann ich irgendwie cout
als printf
verwenden?
ANHANG
Viele sagen, dass die Windows-Konsole keine UTF-8-Zeichen unterstützt. Ich bin ein ungarischer Typ in Ungarn, mein Windows ist auf Englisch eingestellt (außer Datumsformate sind sie auf Ungarisch eingestellt) und kyrillische Buchstaben werden immer noch korrekt neben ungarischen Buchstaben angezeigt:
(Meine Standard-Konsolen-Codepage ist CP852)
Die Unterschiede bestehen darin, wie C ++ - Laufzeit und C-Bibliothek das Systemgebietsschema behandelt.
Um dasselbe Ergebnis mit std :: cout zu erzielen, können Sie std :: ios :: imbue
Aber Hauptproblem mit utf-8 und C ++ beschrieben hier
C ++ 03 bietet zwei Arten von String-Literalen. Die erste Art, die in Anführungszeichen steht, erzeugt ein nullterminiertes Array vom Typ const char. Die zweite Art, definiert als L "", erzeugt ein nullterminiertes Array vom Typ const wchar_t, wobei wchar_t ein Wide-Zeichen ist. Keiner der Literaltypen bietet Unterstützung für Zeichenfolgenliterale mit UTF-8, UTF-16 oder anderen Arten von Unicode-Kodierungen.
Wie auch immer, es ist alles implementierungsspezifisch und daher nicht portierbar, weil nicht die Standard-C ++ - Ausgabeströme utf-8 verstehen können.
Die Kommandozeile scheint irgendwie mit UTF-8 zu funktionieren,
Schauen Sie sich hier und an hier
[EDIT] eigentlich 65001
ist eigentlich UTF-8 nachdem ich PowerShell eingecheckt habe
Sie können die PowerShell viel mächtiger als die alte cmd.exe verwenden
Edit:
Über die Verwendung von Cout, wenn wir im Visual Studio sprechen, ist die richtige Antwort hier eine ausführlichere Erklärung finden Sie hier zu den Best Practices in Visual Studio
Unter Windows werden Einzelbyte-Zeichenfolgen normalerweise als ASCII oder eine 256-Zeichen-Codepage interpretiert. Das bedeutet, dass Sie keine echte Unicode-Unterstützung erhalten.
Die kurze Antwort lautet: Verwenden Sie breite Strings (z. B. L""árvíztűr..."
- beachten Sie das L) und schreiben Sie dann in wcout
anstelle von cout
. Windows interpretiert in der Regel breite (2 Bytes unter Windows) Strings als UTF-16 (oder zumindest eine Close-Variante), so dass es wie vorgesehen funktioniert. Verwenden Sie unter Windows immer breite Zeichenfolgen, um Codierungsprobleme zu vermeiden.
Zunächst Windows-Konsole unterstützt nicht UTF-8 (Codepage 65001, um dies zu testen öffnen Sie eine UTF-8-codierte Datei, die mit Notepad in der Konsole gespeichert und Sie werden Junk-Daten in der Konsole angezeigt werden), so in der Reihenfolge Um Ihre Ausgabe zu überprüfen, sollten Sie sie in eine Datei oder etwas Ähnliches umleiten und das Ergebnis von dort überprüfen (myapp & gt; test.txt).
Sekunde in C / C ++ char [] ist eine Folge von Zeichen, die sowieso interpretiert werden können, die Programmierer wollen, aber UTF-8 ist ein spezielles Protokoll zum Unicode-Zeichensatz, so dass es keine Möglichkeit gibt (neben C ++ 11) dass du eine Sequenz von Zeichen und diese Zeichen in UTF8 kodiert schreibst, weil ich char p[3] = "اب"
sagen werde, aber wenn der Compiler dies in UTF-8 kodieren will, benötigt er 5 Bytes und nicht 3. Also solltest du etwas verwenden, das UTF-8 versteht.
Ich empfehle, boost::locale::conv::utf_to_utf
mit breiten Stringkonstanten zu verwenden. zum Beispiel
Dies wird sicherstellen, dass Sie UTF-8-Zeichenfolge haben, aber überprüfen Sie es nicht erneut mit der Konsole, da UTF-8 überhaupt nicht verstanden wird !!.
Tags und Links c++ visual-studio utf-8