Erläuterung, die für einen UTF-8-vs-cpp-Fall benötigt wird

8

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)

    
Notinlist 22.09.2012, 15:47
quelle

4 Antworten

4

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 Methode und std :: locale

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.

    
Sergei Nikulov 28.09.2012, 09:57
quelle
2

Die Kommandozeile scheint irgendwie mit UTF-8 zu funktionieren,

  1. Eine Schriftart, die UTF-8-Zeichen anzeigen kann
  2. Stellen Sie die richtige Code-Seite in der Befehlszeile ein (chcp 65001), nicht sicher, ob diese Codepage die vollständigen UTF-8-Zeichen unterstützt, aber es scheint die beste verfügbare
  3. zu sein

Schauen Sie sich hier und an hier

[EDIT] eigentlich 65001 ist eigentlich UTF-8 nachdem ich PowerShell eingecheckt habe

%Vor%

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

    
forcewill 01.10.2012 22:24
quelle
1

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.

    
AshleysBrain 22.09.2012 16:00
quelle
1

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

%Vor%

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

    
BigBoss 01.10.2012 12:37
quelle

Tags und Links