Plattformübergreifende UTF-8-Ausgabe unter Windows mit std::cout
Bei der Entwicklung plattformübergreifender Anwendungen in C, bei denen Zeichenfolgen codiert sind In UTF-8 ist es entscheidend, sicherzustellen, dass sie über verschiedene Betriebssysteme hinweg korrekt gehandhabt werden. Auf Unix-Systemen erwartet std::cout problemlos UTF-8-codierte 8-Bit-Zeichenfolgen. Unter Windows wird jedoch standardmäßig Latin-1 oder ähnliche Nicht-Unicode-Formate verwendet.
Um dieses Problem zu beheben, versucht der Code, _setmode() zu verwenden, um std::cout zu zwingen, 8-Bit-Zeichenfolgen als zu interpretieren UTF-8 unter Windows. Dies löst jedoch einen Assertionsfehler in Visual Studio 2015 aus.
Um dieses Problem zu beheben, ist ein umfassenderer Ansatz erforderlich. Der unten gezeigte Code kombiniert Erkenntnisse aus verschiedenen Quellen:
<code class="cpp">#include <string> #include <iostream> #include <Windows.h> #include <cstdio> int main() { // Set console code page to UTF-8 SetConsoleOutputCP(CP_UTF8); // Enable stream buffering to prevent byte-by-byte output setvbuf(stdout, nullptr, _IOFBF, 1000); std::string test = u8"Greek: αβγδ; German: Übergrößenträger"; std::cout << test << std::endl; return 0; }</code>
Zunächst wird die Funktion SetConsoleOutputCP() verwendet, um die Codepage der Konsole auf UTF-8 zu setzen, was angibt, dass der empfangene Bytestream interpretiert werden soll als UTF-8.
Als nächstes wird die Pufferung für std::cout mit setvbuf() aktiviert. Dies liegt daran, dass das Standardverhalten der STL-Implementierung von Visual Studio darin besteht, einzelne Bytes an die zugrunde liegende Datei zu übergeben, was zu Problemen mit UTF-8-Bytesequenzen führt. Pufferung verhindert dieses Problem und verbessert die Leistung. Es wird auch empfohlen, den Stream regelmäßig mit std::endl zu leeren, wie in diesem Beispiel gezeigt.
Beachten Sie abschließend, dass die Windows-Konsole eine TrueType-Schriftart verwenden muss, damit Nicht-ASCII-Unicode-Zeichen korrekt angezeigt werden. Dies ist die Standardeinstellung in Windows 10, aber unter Windows 7 oder früher muss der Benutzer sie möglicherweise manuell in eine Schriftart wie Consolas ändern.
Das obige ist der detaillierte Inhalt vonWie erreiche ich eine plattformübergreifende UTF-8-Ausgabe mit std::cout unter Windows?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!