19 Stimmen

C++ Visual Studio Zeichencodierungsprobleme

Nicht in der Lage zu sein, das zu verstehen, ist eine echte Schande...

Ich arbeite mit einer französischen Version von Visual Studio (2008) in einem französischen Windows (XP). Französische Akzente, die in Zeichenfolgen an das Ausgabefenster gesendet werden, werden beschädigt. Gleiches gilt für die Eingabe aus dem Ausgabefenster. Typisches Zeichencodierungsproblem. Ich gebe ANSI ein, erhalte UTF-8 zurück oder etwas in der Art. Welche Einstellung kann sicherstellen, dass die Zeichen in ANSI bleiben, wenn eine "fest codierte" Zeichenfolge im Ausgabefenster angezeigt wird?

EDIT:

Beispiel:

#include 

int main()
{
std::cout << "àéêù" << std::endl;

return 0;
}

Wird im Ausgabefenster angezeigt:

óúÛ¨

(hier als HTML für Ihr Sehvergnügen encodiert)

Ich würde gerne möchten, dass es stattdessen so angezeigt wird:

àéêù

0 Stimmen

Can you give us a little bit more input. Is this happening for build output, all output or something else? Can you give us a specific operation for which this happens (build, debugging, etc ...)

0 Stimmen

Ja, bitte zeigen Sie ein Beispiel dafür, was Ihrer Meinung nach erscheinen sollte und was tatsächlich erscheint.

1 Stimmen

Was passiert, wenn Sie wcout verwenden?

3voto

vladasimovic Punkte 290
//Speichern als Windows 1252
#include
#include

int main()
{
    SetConsoleOutputCP(1252);
    std:: cout << "àéêù" << std:: endl;
}

Visual Studio unterstützt kein UTF 8 für C ++, aber teilweise für C:

//Speichern als UTF8 ohne Signatur
#include
#include

int main()
{
    SetConsoleOutputCP(65001);
    printf("àéêù\n");
}

1voto

Mikal Punkte 19

Stellen Sie sicher, dass Sie nicht vergessen, die Schriftart der Konsole auf Lucida Consolas zu ändern, wie von Bahbar erwähnt: das war in meinem Fall entscheidend (Französisch gewinnen 7 64 Bit mit VC 2012).

Dann wie von anderen erwähnt, verwenden Sie SetConsoleOutputCP(1252) für C++, aber es kann je nach verfügbaren Seiten fehlschlagen, sodass Sie GetConsoleOutputCP() verwenden möchten, um zu überprüfen, ob es funktioniert hat oder zumindest zu überprüfen, dass SetConsoleOutputCP(1252) null zurückgibt. Die globale Locale zu ändern funktioniert auch (aus irgendeinem Grund ist es nicht erforderlich, cout.imbue(locale()); zu verwenden, aber es kann einige Bibliotheken brechen!

In C, hat SetConsoleOutputCP(65001); oder der auf der Locale basierende Ansatz für mich funktioniert, nachdem ich den Quellcode als UTF8 ohne Signatur gespeichert hatte (scrollen Sie nach unten, die Wahl ohne Signatur befindet sich weit unten in der Liste der Seiten).

Die Eingabe mit SetConsoleCP(65001); ist bei mir fehlgeschlagen, anscheinend aufgrund einer schlechten Implementierung von Seite 65001 in Windows. Der Ansatz über die Locale ist sowohl in C als auch in C++ gescheitert. Eine aufwendigere Lösung, die nicht auf nativen Zeichen, sondern auf wchar_t basiert, scheint erforderlich zu sein.

1voto

Gary Punkte 1

Ich hatte dasselbe Problem mit der chinesischen Eingabe. Mein Quellcode ist utf8 und ich habe /utf-8 in der Compileroption hinzugefügt. Es funktioniert gut unter c++ wide-string und wide-char, aber nicht unter narrow-string/char, was zu fehlerhaften Zeichen/Codes im Visual Studio 2019 Debugger und meiner SQL-Datenbank führt. Ich muss die narrow characters verwenden, um sie in SAString von SQLAPI++ umzuwandeln. Letztendlich habe ich festgestellt, dass das Überprüfen der folgenden Option (Systemsteuerung->Region->Administrative->Systemlokale ändern) das Problem lösen kann. Ich weiß, dass es keine ideale Lösung ist, aber es hat mir geholfen.

Bildbeschreibung hier eingeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X