C ++: вывод широких символов неправильно? - PullRequest
7 голосов
/ 28 июня 2010

Мой код в основном такой:

wstring japan = L"日本";
wstring message = L"Welcome! Japan is ";

message += japan;

wprintf(message.c_str());

Я хочу использовать широкие строки, но я не знаю, как они выводятся, поэтому я использовал wprintf.Когда я запускаю что-то вроде:

./widestr | hexdump

Шестнадцатеричные кодовые точки создают это:

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  ?  ?

Почему все они прыгают в порядке?Я имею в виду, если wprintf не так, я все еще не понимаю, почему он выводил бы в таком конкретном беспорядочном порядке!

edit: endianness или что-то еще?кажется, они вращают каждые два символа.Да.

РЕДАКТИРОВАТЬ 2: Я пытался использовать wcout, но он выводит точно такие же шестнадцатеричные кодовые точки.Weird!

1 Ответ

12 голосов
/ 28 июня 2010

Вам необходимо определить языковой стандарт

    #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;
    }

Работает так, как ожидается (то есть преобразовать широкую строку в узкий UTF-8 и распечатать ее).

Когда вы определяете глобальный языковой стандарт для "" -вы устанавливаете системный языковой стандарт (и если это UTF-8, он будет распечатан как UTF-8 - т.е. wstring будет преобразован)

Edit: забудьте, что я сказал о sync_with_stdio -это не правильно, они синхронизируются по умолчанию.Не нужно.

...