我正在尝试将包含平假名的文本从 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"

10-08 18:16