Как инициализировать или назначить 中文 для wstring? - PullRequest
4 голосов
/ 27 сентября 2019

Я пытался использовать L "string", но он не работает.

#include <iostream>
using namespace std;

int main(){
    wstring wstr = L"你好";//[Error] converting to execution character set: Illegal byte sequence
    wcout<<wstr<<endl;
}

Использовать wcin и ввод 中文 отлично работает.

#include <iostream>
using namespace std;

int main(){
    wstring wstr;
    wcin>>wstr;//Input Chinese is OK
    wcout<<wstr<<endl;
}

Как инициализировать или назначить中文 to wstring?

Редактировать : Я пробовал некоторые онлайн-компиляторы.Все они могут компилироваться, но все выводят "??".

например, cpp.sh jdoodle onlinegdb repl.it

Edit 2 : я установил g ++ i868 MinGW-W64 8.1+0,0.Используйте Visual Studio, чтобы сохранить файл cpp в формате utf8.Затем используйте командную строку для его компиляции.По-прежнему ничего не выводится.

Ответы [ 3 ]

5 голосов
/ 27 сентября 2019

Ваш компилятор явно не любит символы Юникода в своих исходных файлах.Попробуйте инициализировать вашу строку с помощью экранирования Unicode, вместо этого:

wstring wstr = L"\u4E2D\u6587"; // These MAY be the correct codes.

Где 4E2D и 6587 заменены фактическими шестнадцатеричными значениями для символов, которые вы хотите.(Извините, но у меня нет доступа к полной таблице Юникода для китайских символов: я попытался вставить их в свой компилятор, и это значения, которые он дал мне при переводе.)

Приведенные значения Юникодадля символьной строки в вашем вопросе (中文);для (другого - 你好) в вашем опубликованном коде используйте L"\u4F60\u597D".

Также см. ответ @ MarekR.

3 голосов
/ 27 сентября 2019

Это должно быть проблема конфигурации!

Очевидно, ваш компилятор использует другую кодировку, чем ваш файл записан в!Поскольку вы используете Windows, скорее всего, кодировка файла на вашем компьютере - не UTF-8 (в конце концов вы скопировали этот файл в Linux), а что-то другое.Так как gcc более дружественен к Linux, он может ожидать UTF-8 и у вас возникнет конфликт.

Это распространенная проблема, поскольку Windows долгое время поддерживала некоторую обратную совместимость с DOS (где допускались только однобайтовые символы)и используемые системой кодовые страницы для соответствующих языков).

Как вы можете увидеть здесь , большинство компиляторов с настройками по умолчанию не имеют проблем с кодом, в котором используются китайские символы.
Я не вижу TCM-GCC 4.9.2 компилятор на godbolt, нов конце концов, это не очень старый gcc.

Я рекомендую убедиться, что код написан на UTF-8, а компилятор будет обрабатывать источники как кодированные в UTF-8.

Редактировать : Добавление std::locale::global(std::locale("")); сделало ваш код правильно отображающим эту строку на кресте.

0 голосов
/ 27 сентября 2019

Я пробовал в Visual Studio.Это работает (выводит «你好»), если я сохранил свой C ++ файл в формате Unicode или utf8.Можете ли вы попробовать сохранить ваш файл C ++ в Unicode или utf8?

...