std :: wstring与平假名的QString转换

时间:2014-05-23 05:16:53

标签: c++ windows qt qstring

我正在尝试将包含平假名的文本从 wstring 转换为 QString ,以便可以在标签的文本属性上使用它。但是我的代码不起作用,我不确定为什么会这样。

以下转换方法显然告诉我,我做错了什么:

std::wstring myWString = L"Some Hiragana: あ い う え お";
ui->label->setText(QString::fromStdWString(myWString));

输出:有些平假名:ã,ã“ããããã

如果我把它们直接放在一个字符串中,我可以在标签上打印平假名:

ui->label->setText("Some Hiragana: あ い う え お");

输出:一些平假名:あいうえお

这意味着我可以通过简单地使用std :: string而不是std :: wstring来避免这个问题,但我想知道为什么会这样。

1 个答案:

答案 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"