QString - 嵌入16位的UTF8?

时间:2015-12-03 11:34:31

标签: c++ qt

我很惊讶。我开始挖掘QString::data(),同时尝试用QString与ASCII相关问题帮助另一位提问者。

我制作了以下代码来查看QString数据的每个16位包,发现像'ä'和'ß'这样的字母似乎是用UTF-8编码的,但是使用16位来存储8位。当然,他们可以按自己喜欢的方式做,但文档说QString将采用UTF-16。但它看起来与我不同。

校正: Qt 4.8的QString doc并没有真正提到UTF-16。 但它也没有声明UTF-8与16位一起使用。

拜托,有人可以开导我吗??

我的代码:

QString h("AßB");

char * pt = (char*)h.data();

for(int i = 0; ;i+=2) {

   // get 16bit value
   u_int16_t s = *(u_int16_t*)(pt + i);

   // break condition
   if(s == 0) break;

   qDebug() << i << s << QChar(s) << h.size();
}

qDebug()告诉我的是什么:

0 65 'A' 4 
2 195 'Ã' 4 
4 159 '' 4 
6 66 'B' 4 

请注意,'ß'似乎是UTF-8编码,而编码的两个部分仍使用16位。

195 159是'ß'的UTF-8编码。

我的char图告诉我'ß'的UTF-16表示应该是0x00DF。这就是我希望得到的。

另请注意,QString::size()报告的可疑大小为4而不是3。

1 个答案:

答案 0 :(得分:0)

QString数据在内部存储为Unicode。来自qt docs:

QString str = "Hello";

“QString使用fromUtf8()函数将const char *数据转换为Unicode。”

以下是链接:QString Class

奇怪的是,我没有看到任何toUTF16()方法;虽然它确实有一个toUTF8。

此外,UTF-16不是Unicode:

“Unicode标准编码U + 0000..U + 10FFFF范围内的字符,相当于21位代码空间。根据您选择的编码格式(UTF-8,UTF-16或UTF-) 32),每个字符将表示为一到四个8位字节的序列,一个或两个16位代码单元或一个32位代码单元。“

来自:Frequently Asked Questions - UTF-8, UTF-16, UTF-32 & BOM

编辑:

我知道MSVC过去常用于编译Unicode和非Unicode构建。来自M $:

“Unicode UTF-16编码

将Unicode字符表示为16位整数的序列。您的应用程序可以使用UnicodeEncoding类将字符转换为UTF-16编码。

UTF-16通常在本机使用,如Microsoft.Net字符类型,Windows WCHAR类型和其他常见类型。最常见的Unicode代码点只占用一个UTF-16代码点(2个字节)。 Unicode补充字符U + 10000和更高版本仍需要两个UTF-16代理代码点。“

.NET Framework 3.5 - Using Unicode Encoding上找到。

因此,M $ IS通常在内部使用UTF-16。 Unicode是21位长的符号列表,有各种UTF格式可以对它们进行编码。

这对Ubuntu有何影响? M $在UTF-16内部编码并将其称为Unicode。

Frank Osterfeld显然在您的代码中发现了问题:编译器使用源文件的编码来生成字符串文字。奇怪的是,它使用的是16位编码,并提出了UTF-8值;从而得出错误的字符序列!如果你打印出QString,我想知道它是否会变成带有变音符号的“A”。它可能会在您看到它之前转换回相同的UTF-8,尽管编译器显然不理解它。弗兰克和你,已经能够证明在Ubuntu上,Qt使用UTF-16。在未编码时(即21位),似乎很难看到计算机数据中的Unicode字符。 “Unicode”构建显然是UTF-16版本。