【问题标题】:std::wstring to QString conversion with Hiragana使用平假名将 std::wstring 转换为 QString
【发布时间】:2014-05-23 05:16:52
【问题描述】:

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

下面的转换方法明显告诉我我做错了:

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

输出: 一些平假名:゠ㄠㆠ㈠ãŠ

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

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

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

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

【问题讨论】:

  • 出现了一些奇怪的 UTF-8 Windows-1252 恶作剧,源文件的编码是什么,你使用的是什么编译器?
  • 文件编码为UTF-8,编译器为Microsoft Visual C++ Compiler 12.0 (x86)。
  • 你试过QString::fromWCharArray( myWString.c_str());myString.toUtf8()吗?
  • @Laszlo Papp 我之前尝试过,但结果相同。我认为我的 Qt 不喜欢 UTF-8。 ^^
  • @user3582665:好的,你没有提到,所以只是仔细检查。 ;)

标签: c++ windows qt qstring


【解决方案1】:

VS 将文件解释为 Windows-1252 而不是 UTF-8。

例如,UTF-8 中的“あ”是 E3 81 82,但编译器在将每个字节转换为相应的 UTF-16 代码点 E3 201A 之前将其读取为单个 Windows-1252 字符,这样可以解决为 'ã‚'(81 要么被 VS 忽略,因为它在 Windows-1252 中保留,或者如果 VS 碰巧将其转换为相应的 C1 控制字符,则不会由 qt 打印)。

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

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

解决此问题的唯一可移植方法是改用转义序列:

L"Some Hiragana: \u3042 \u3044 \u3046 \u3048 \u304A"

【讨论】:

  • @user657267 感谢您的有用解释。现在一切都说得通了。
  • 嗯,这不是唯一的便携方式。 OP 也可以直接使用 Qt,因为它是 Qt 的目的。 ;)
  • @LaszloPapp 这是唯一可移植的方式,基本源字符集([lex.charset])之外的任何字符的表示都是实现定义的。
  • 我不关注,OP可以直接使用QString。事实上,他在有效的问题中写道,这很可能是这里应该做的,而不是其他解决方法。好吧,如果由我来决定,我会这样做以避免痛苦。 :)
  • @Laszlo Papp 我希望这能奏效。 QString myQString = "一些平假名:あいうえお"; ui->label->setText(myQString);输出:一些平假名:? ? ? ? ?
猜你喜欢
  • 2013-01-21
  • 2011-08-03
  • 2011-01-03
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2011-05-19
相关资源
最近更新 更多