Das Problem besteht darin, dass die Konsole andere Codepages als der Rest des Systems verwendet. Zum Beispiel verwenden normalerweise Windows-Systeme, die für Amerika und Westeuropa eingerichtet wurden, CP1252, aber die Konsole in diesen Regionen verwendet CP437 oder CP850.
Sie können entweder die Ausgabe-Codepage der Konsole an die von Ihnen verwendete Codierung anpassen oder Sie können die Zeichenfolgen so konvertieren, dass sie der Ausgabe-Codepage der Konsole entsprechen.
Stellen Sie die Konsolenausgabe Codepage:
SetConsoleOutputCP(GetACP()); // GetACP() returns the system codepage.
std::cout << "La chaîne qui correspond au code \"TEST_CODE\" n'a pas été trouvée à l'aide locale \"fr\".";
Oder ein von vielen Möglichkeiten zwischen Codierungen (dies erfordert VS2010 oder höher) zu konvertieren:
#include <codecvt> // for wstring_convert
#include <locale> // for codecvt_byname
#include <iostream>
int main() {
typedef std::codecvt_byname<wchar_t,char,std::mbstate_t> codecvt;
// the following relies on non-standard behavior, codecvt destructors are supposed to be protected and unusable here, but VC++ doesn't complain.
std::wstring_convert<codecvt> cp1252(new codecvt(".1252"));
std::wstring_convert<codecvt> cp850(new codecvt(".850"));
std::cout << cp850.to_bytes(cp1252.from_bytes("...été trouvée à...\n")).c_str();
}
Letzteres Beispiel vorausgesetzt, dass Sie in der Tat müssen Sie zwischen 1252 und 850 konvertieren. Sie sollten wahrscheinlich die Funktion GetOEMCP() verwenden, um die tatsächliche Zielcodepage herauszufinden, und die Quellcodepage hängt tatsächlich davon ab, was Sie für den Quellcode und nicht für das Ergebnis von GetACP() verwenden die Maschine, auf der das Programm läuft.
Beachten Sie auch, dass dieses Programm auf etwas angewiesen ist, das nicht vom Standard garantiert wird: dass die wchar_t-Codierung zwischen Gebietsschemata aufgeteilt wird. Dies gilt für die meisten Plattformen — normalerweise einige Unicode-Codierung wird für wchar_t in allen Gebietsschemas verwendet —, aber nicht alle.
Idealerweise könnte man nur UTF-8 verwenden, überall und die folgenden gut funktionieren würde, wie es auf anderen Plattformen in diesen Tagen tut:
#include <iostream>
int main() {
std::cout << "La chaîne qui correspond au code \"TEST_CODE\" n'a pas été trouvée à l'aide locale \"fr\".\n";
}
Leider kann von Windows nicht unterstützt UTF-8 auf diese Weise ohne entweder UTF-16 als die wchar_t-Kodierung aufzugeben und ein 4-Byte-wchar_t zu übernehmen oder die Anforderungen des Standards zu verletzen und standardkonforme Programme zu brechen.
Ich nehme an, Sie verwenden Windows? –
Ja ich bin, werde meine Frage ändern, um anzugeben. – jmegaffin
@Boreal: Stellen Sie sicher, dass Sie die in der Datei gespeicherte Zeichenfolge in Unicode UTF-16 konvertieren (was als Unicode-Codierung in einer Windows-Anwendung sinnvoll ist). Sie können das tun, indem Sie die Zeichenfolge aus Ihrer Datei lesen und dann 'MultiByteToWideChar()' API (oder ATL-Umwandlungshilfe 'CA2W') verwenden, um von Ihrer spezifischen Codierung in UTF-16 zu konvertieren. Um dann eine Unicode-Zeichenfolge in die Konsole zu drucken, müssen Sie die Konsole nur mit _setmode (_fileno (stdout), _O_U16TEXT); 'initialisieren, und dann können Sie' wprintf() 'oder' std :: wcout' verwenden. Siehe meine Antwort für weitere Details und Links. –