Heim > Backend-Entwicklung > C++ > Wie erreiche ich eine plattformübergreifende UTF-8-Ausgabe mit std::cout unter Windows?

Wie erreiche ich eine plattformübergreifende UTF-8-Ausgabe mit std::cout unter Windows?

DDD
Freigeben: 2024-11-03 06:45:30
Original
314 Leute haben es durchsucht

How to Achieve Cross-Platform UTF-8 Output with std::cout on Windows?

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage