C ++: Wide-Zeichen ausgibt falsch?
-
01-10-2019 - |
Frage
Mein Code ist im Grunde diese:
wstring japan = L"日本";
wstring message = L"Welcome! Japan is ";
message += japan;
wprintf(message.c_str());
Ich wünsche Wide-Strings zu verwenden, aber ich weiß nicht, wie sie ausgegeben sind, so dass ich wprintf verwendet. Wenn ich laufe etwas wie:
./widestr | hexdump
Die hexadezimalen Codepoints erstellen, um diese:
65 57 63 6c 6d 6f 21 65 4a 20 70 61 6e 61 69 20 20 73 3f 3f
e W c l m o ! e J p a n a i s ? ?
Warum sind sie sprangen alle in Ordnung? Ich meine, wenn die wprintf falsch ich noch nicht bekommen, warum es Ausgang würde in einem solchen spezifischen purzeln um!
edit: Endian oder so etwas? sie scheinen jeweils zwei Zeichen zu drehen. huh.
EDIT 2: Ich habe versucht wcout verwenden, aber es gibt die exakt gleichen hexadezimalen Codepoints. Seltsam!
Lösung
Sie müssen locale definieren
#include <stdio.h>
#include <string>
#include <locale>
#include <iostream>
using namespace std;
int main()
{
std::locale::global(std::locale(""));
wstring japan = L"日本";
wstring message = L"Welcome! Japan is ";
message += japan;
wprintf(message.c_str());
wcout << message << endl;
}
Arbeiten wie erwartet (das heißt konvertieren breite Zeichenfolge zu schmal UTF-8 und drucken).
Wenn Sie globale Locale auf „“ definieren - Sie Set System Locale (und wenn es UTF-8 wäre es ausgedruckt als UTF-8 - d.h. wstring umgewandelt werden)
Edit: vergessen, was ich sagte über sync_with_stdio - das ist nicht richtig, sie standardmäßig synchronisiert sind. Nicht erforderlich.