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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top