什么是QString :: toUtf8呢?

时间:2011-01-31 16:12:06

标签: qt utf-8 utf

这可能听起来像一个显而易见的问题,但我遗漏了UTF-8的编码方式或toUtf8功能的工作原理。

让我们来看一个非常简单的程序

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

然后我得到输出

"Müller" "4dc383c2bc6c6c6572" 

但我明白letter ü应该编码为 c3bc 而不是 c383c2bc

由于 约翰

2 个答案:

答案 0 :(得分:18)

这取决于源代码的编码。

我倾向于认为你的文件已经用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) - &gt; C3 83

¼(BC) - &gt; 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编码,默认情况下就会使用它。

答案 1 :(得分:2)

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

"4dc3bc6c6c6572"

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