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

std::wstring to QString conversion with Hiragana

本文关键字:QString 转换 wstring std 平假名      更新时间:2023-10-16

我试图将包含平假名的文本从wstring转换为QString,以便它可以在标签的文本属性上使用。然而,我的代码不工作,我不知道为什么。

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

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,但编译器在将其转换为各自的UTF-16码点E3 201A之前将每个字节读取为单个Windows-1252字符,其计算结果为'ã, ' (81要么被VS忽略,因为它在Windows-1252中保留,或者不被qt打印,如果VS恰好将其转换为各自的C1控制字符)。

直接版本有效,因为编译器不执行任何转换,并将字符串保留为E3 81 82

要解决您的问题,您需要通知VS文件是UTF-8,根据其他帖子的一种方法是确保文件具有UTF-8 BOM。

唯一可移植的修复方法是使用转义序列:

L"Some Hiragana: u3042 u3044 u3046 u3048 u304A"