【问题标题】:What is QString::toUtf8 doing?QString::toUtf8 在做什么?
【发布时间】:2011-06-18 16:43:11
【问题描述】:

这听起来像是一个显而易见的问题,但我错过了一些关于 UTF-8 的编码方式或 toUtf8 函数如何工作的内容。

我们来看一个很简单的程序

QString str("Müller");
qDebug() << str << str.toUtf8().toHex();

然后我得到输出

"Müller" "4dc383c2bc6c6c6572" 

但我知道letter ü 应该被编码为 c3bc 而不是 c383c2bc

谢谢 约翰

【问题讨论】:

标签: qt utf-8 utf


【解决方案1】:

这取决于你的源代码的编码。

我倾向于认为您的文件已经以 UTF-8 编码,字符 ü 被编码为 C3 BC。

您正在调用 QString::QString ( const char * str ) 构造函数,根据 http://doc.qt.io/qt-4.8/qstring.html#QString-8,该构造函数使用 QString::fromAscii() 方法将您的字符串转换为 unicode,该方法默认将输入视为 Latin1 内容。

由于 C3 和 BC 在拉丁文 1 中都有效,分别代表 Ã 和 ¼,因此将它们转换为 UTF-8 会导致以下字符:

à (C3) -> C3 83

¼ (BC) -> C2 BC

这导致你得到的字符串:“4d c3 83 c2 bc 6c 6c 65 72”

总结起来就是双 UTF-8 编码。

有几个选项可以解决这个问题:

1) 您可以使用自己喜欢的文本编辑器将源文件转换为 Latin-1。

2) 您可以正确地将 ü 字符转义到文字字符串中的 \xFC 中,因此该字符串将不依赖于文件的编码。

3) 您可以将文件和字符串保留为 UTF-8 数据并使用QString str = QString::fromUtf8 ("Müller");

更新:此问题在 QT5 中不再相关。 http://doc.qt.io/qt-5/qstring.html#QString-8 声明构造函数现在在内部使用 QString::fromUtf8() 而不是 QString::fromAscii()。所以,只要一致使用 UTF-8 编码,就会默认使用。

【讨论】:

    【解决方案2】:

    运行你的代码我得到了预期的结果

    "4dc3bc6c6c6572"

    我认为问题在于您的输入而不是输出。 检查源文件的编码并查看 void QTextCodec::setCodecForCStrings ( QTextCodec * codec ) [static]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2013-08-19
      • 2015-03-14
      • 1970-01-01
      相关资源
      最近更新 更多