QString-UTF8嵌入在16Bits中

QString - UTF8 embedded in 16Bits?

本文关键字:16Bits QString-UTF8      更新时间:2023-10-16

我很惊讶。我开始深入研究QString::data(),同时试图帮助这里的另一个提问者解决QString与ASCII相关的问题。

我制作了下面的一段代码,查看了QString数据的每个16位包,发现像"ä"answers"ß"这样的字母似乎是用UTF-8编码的,但使用16位来存储8位。当然,他们可以随心所欲,但医生说QString将在UTF-16中。但我觉得不一样。

更正:Qt 4.8的QString文档并没有真正提到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编码。

我的字符映射告诉我UTF-16表示应该是"ß"的0x00DF。这就是我希望得到的。

还要注意,QString::size()报告了4而不是3的可疑大小。

QString数据以Unicode的形式存储在内部。来自qt文档:

QString str = "Hello";

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

这是链接:QString类

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

此外,UTF-16不是Unicode:

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

发件人:常见问题-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上找到-使用Unicode编码。

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

这对你在Ubuntu上有什么影响?M$在UTF-16中对事物进行内部编码,并将其称为Unicode。

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