C++: широкие символы, производящие неправильно?

Мой код - в основном это:

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 неправильным, что я все еще не добираюсь, почему он произвел в таком определенном смешанном порядке!

править: порядок байтов или что-то? они, кажется, поворачивают каждого два символа. ха.

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

7
задан Omnifarious 28 June 2010 в 06:53
поделиться

1 ответ

Необходимо определить локаль

    #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 - если это UTF-8. будет выведена как UTF-8 - т.е. wstring будет преобразован)

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

12
ответ дан 6 December 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: