我正在尝试将包含平假名的文本从 wstring 转换为 QString ,以便可以在标签的text属性上使用。但是我的代码不起作用,我不确定为什么会这样。
以下转换方法显然告诉我我做错了:
std::wstring myWString = L"Some Hiragana: あ い う え お";
ui->label->setText(QString::fromStdWString(myWString));
输出:某些平假名:ã,ããã†ãˆãŠ
如果将平假名直接放在字符串中,则可以在标签上打印平假名:
ui->label->setText("Some Hiragana: あ い う え お");
输出:某些平假名:あいう
这意味着我可以通过简单地使用std::string而不是std::wstring来避免此问题,但是我想知道为什么会这样。
最佳答案
VS将文件解释为Windows-1252,而不是UTF-8。
例如,UTF-8中的'あ'是E3 81 82
,但是编译器将每个字节读取为单个Windows-1252字符,然后将其转换为相应的UTF-16代码点E3 201A
,结果为'ã'(81
会被VS忽略(因为它在Windows-1252中已保留),或者如果VS恰巧将其转换为相应的C1控制字符,则不会被qt打印)。
直接版本起作用是因为编译器不执行任何转换,并将字符串保留为E3 81 82
。
要解决您的问题,您需要通知VS该文件为UTF-8,根据其他帖子,一种方法是确保文件具有UTF-8 BOM。
解决此问题的唯一便携式方法是改用转义序列:
L"Some Hiragana: \u3042 \u3044 \u3046 \u3048 \u304A"