这可能听起来像一个显而易见的问题,但我遗漏了UTF-8如何编码或toUtf8功能如何工作的问题.
我们来看一个非常简单的程序
QString str("Müller");
qDebug() << str << str.toUtf8().toHex();
Run Code Online (Sandbox Code Playgroud)
然后我得到输出
"Müller" "4dc383c2bc6c6c6572"
Run Code Online (Sandbox Code Playgroud)
但是我知道字母ü应该编码为c3bc而不是c383c2bc.
谢谢约翰
Sir*_*ius 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) - > 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编码,默认情况下将使用它.