2011-01-31 373 views
12

这可能听起来像是一个明显的问题,但我错过了UTF-8的编码方式或toUtf8函数的工作原理。什么是QString :: toUtf8在做什么?

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

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

然后我得到的输出

"Müller" "4dc383c2bc6c6c6572" 

但我上心的的letter ü应该被编码为c3bc而不是c383c2bc

感谢 约翰

+0

http://stackoverflow.com/questions/29485602/qt-convert-unicode-entites – trante 2015-04-07 10:14:32

回答

17

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

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

你调用QString::QString (const char * str)构造函数,根据http://doc.qt.io/qt-4.8/qstring.html#QString-8,转换您的字符串中使用的默认情况下考虑输入为Latin1的内容的QString :: fromAscii()方法为Unicode。由于C3和BC在拉丁文1中都是有效的,分别代表&Atilde;和&frac14 ;,将它们转换为UTF-8将导致以下字符:

&Atilde; (C3)→C3 83

&frac14; (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编码一直使用,它将被默认使用。