这听起来像是一个显而易见的问题,但我错过了一些关于 UTF-8 的编码方式或 toUtf8 函数如何工作的信息。
我们来看一个非常简单的程序
QString str("Müller");
qDebug() << str << str.toUtf8().toHex();
然后我得到输出
"Müller" "4dc383c2bc6c6c6572"
但我知道字母 ü应该被编码为c3bc而不是c383c2bc。
谢谢约翰
这取决于源代码的编码。
我倾向于认为您的文件已经以 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)您可以正确地将 ü 字符转义到 litteral 字符串中的 \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 编码,就会默认使用它。
运行你的代码我得到了预期的结果
"4dc3bc6c6c6572"
我认为问题在于您的输入而不是输出。检查源文件的编码并查看
void QTextCodec::setCodecForCStrings ( QTextCodec * codec ) [static]