我正在尝试将包含平假名的文本从 wstring 转换为 QString ,以便可以在标签的文本属性上使用它。但是我的代码不起作用,我不确定为什么会这样。
以下转换方法显然告诉我,我做错了什么:
std::wstring myWString = L"Some Hiragana: あ い う え お";
ui->label->setText(QString::fromStdWString(myWString));
输出:有些平假名:ã,ã“ããããã
如果我把它们直接放在一个字符串中,我可以在标签上打印平假名:
ui->label->setText("Some Hiragana: あ い う え お");
输出:一些平假名:あいうえお
这意味着我可以通过简单地使用std :: string而不是std :: wstring来避免这个问题,但我想知道为什么会这样。
答案 0 :(得分:2)
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"