Welcher richtigste Weg, um die Kodierung in C ++ zu setzen?

8

Wie ist es am besten, die Codierung in C ++ zu setzen?

Ich habe mich daran gewöhnt, mit Unicode zu arbeiten (und wchar_t , wstring , wcin , wcout und L "..."). Ich speichere auch Quelle in UTF-8.

Im Moment verwende ich MinGW (Windows 7) und führe mein Programm in der Windows-Konsole (cmd.exe) aus, aber manchmal kann ich gcc unter GNU \ Linux verwenden und promgram in der Linux-Konsole mit UTF-8-Codierung ausführen.

Ich möchte immer meine Quelle unter Windows und Linux kompilieren und möchte, dass alle Unicode-Symbole korrekt eingegeben und ausgegeben werden.

Als ich das nächste Problem mit den Codierungen sah, googelte ich. Auch habe ich die verschiedensten Räte gefunden: setlocale(LC_ALL, "") und setlocale(LC_ALL, "xx_XX.UTF-8") , std::setlocale(LC_ALL, "") und std::setlocale(LC_ALL, "xx_XX.UTF-8") von <clocale> ,

SetConsoleCP() und SetConsoleOutputCP() von <windows.h> und viele, viele andere.

Endlich hat mich dieser Schamanismus gestört und ich möchte Sie fragen: Wie ist es richtig, die Kodierung herzustellen?

    
shau-kote 05.04.2013, 04:57
quelle

2 Antworten

5
  

Ich brauche, dass jedes Unicode Symbol / String korrekt eingegeben und ausgegeben wurde.

Dies ist sicherlich möglich, obwohl die Windows-Eingabeaufforderungskonsole korrekt Unicode-fähig ist, erfordert besondere Magie. Ich bezweifle ernsthaft, dass dies von irgendwelchen Implementierungen der Standard-Bibliotheksfunktionen leider ausgeführt wird.

Sie finden eine Reihe von Fragen dazu in Stack Overflow, aber dieses ist ein gutes . Im Grunde verwendet die Konsole standardmäßig die (etwas irrtümlich) "OEM" -Codepage. Sie möchten dies auf die UTF-8-Codepage ändern, deren Wert durch CP_UTF8 definiert ist. Um dies zu tun, müssen Sie die Funktion SetConsoleCP aufrufen Eingabe Codepage) und die Funktion SetConsoleOutputCP (zu setzen die Ausgabe Codepage). Der Code würde ungefähr so ​​aussehen:

%Vor%

Für zusätzliche Robustheit sollten Sie außerdem sicherstellen, dass die UTF-8-Codepage zuerst unterstützt wird, bevor Sie versuchen, sie festzulegen und zu verwenden. Sie würden dies tun, indem Sie die Funktion IsValidCodePage aufrufen. Zum Beispiel:

%Vor%

Sie müssen auch die Schriftart von der Standardeinstellung ("Raster Fonts") in etwas ändern, das die erforderlichen Unicode-Zeichen enthält - z. B. Lucida Console oder Consolas ( Referenz ). Das ist mit der Funktion SetCurrentConsoleFontEx trivial.

Leider existiert diese Funktion in Windows-Versionen vor Vista nicht. Wenn Sie diese älteren Betriebssysteme unbedingt unterstützen müssen, muss ich nur die undokumentierte SetConsoleFont -Funktion aufrufen. Normalerweise würde ich stark dagegen raten, undokumentierte Funktionen zu verwenden, aber ich denke, das ist hier weniger problematisch, da Sie nur es in alten Versionen des Betriebssystems verwenden würden. Du weißt, dass sich das nicht ändern wird. In den neueren Versionen, in denen es verfügbar ist, rufen Sie die unterstützte Funktion auf. Beispiel für nicht getesteten Code:

%Vor%

Beachten Sie, dass ich die erforderliche Fehlerprüfung als Übung für den Leser hinzugefügt habe. Der Fokus liegt hier auf Technik und Lesbarkeit; Verstopfte es mit Fehlerbehandlung würde nur verwirren die Dinge.

Ich habe keine Ahnung, wie ich das unter Linux machen könnte. Ich vermute, es ist viel weniger Arbeit, da die Leute mir sagen, dass das Betriebssystem intern UTF-8 verwendet. Wie auch immer, du bist dafür allein; Windows-Schnurren machen ist genug Arbeit für eine Antwort!

    
Cody Gray 06.04.2013, 00:11
quelle
0

Ich musste gerade Unicode-Text an die Konsole und nur diese Funktion WriteConsoleW (GetStdHandle(STD_OUTPUT_HANDLE), ...); half. Für die Eingabe nehme ich an ReadConsoleW (GetStdHandle(STD_INPUT_HANDLE), ...); tut der Trick.

PS : WriteOutput hat ein Limit in der Größe der Ausgabezeichenfolge. Vielleicht möchten Sie es in Chunks iterieren, wenn es länger ist.

    
CodeAngry 26.03.2014 02:55
quelle

Tags und Links