Вопрос

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

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

message += japan;

wprintf(message.c_str());

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

./widestr | hexdump

Гестексимальные коды CodePoints создают это:

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, но выводит то же самое одинаково одинаковую градусную кодировку. Странный!

Это было полезно?

Решение

Вам нужно определить локаль

    #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 - т. Е. В конституции будет преобразована)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top