我很惊讶。我开始研究QString::data(),同时试图帮助这里的另一个提问者解决QString与ASCII相关的问题。
我做了下面的代码,查看每16位包的QString数据,发现像‘a’和‘这样的字母似乎被编码在UTF-8中,但是使用16位来存储8位。当然,他们可以为所欲为,但医生说,QString将在UTF-16。但在我看来不一样。
校正:QT4.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 请注意,在编码的两个部分仍然使用16位时,‘ENT-8’似乎是编码的。
195 159是编码‘UTF’的UTF-8。
我的char地图告诉我,UTF-16的表示应该是0x00DF表示‘。这就是我希望得到的。
还请注意,QString::size()报告的大小有问题的是4而不是3。
发布于 2016-08-17 19:22:40
QString数据以Unicode的形式在内部存储。来自qt文档:
QString str = "Hello";"QString使用fromUtf8()函数将const *数据转换为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 char类型、Windows类型和其他常见类型中。大多数常见的Unicode代码点只需要一个UTF-16代码点(2个字节)。Unicode补充字符U+10000及更高版本仍然需要两个UTF-16代码点.“
在.NET框架3.5 -使用Unicode编码上发现的。
因此,M$经常在内部使用UTF-16。Unicode是21位长的符号列表,有多种UTF格式对它们进行编码。
这对Ubuntu有什么影响?M$在UTF-16内部编码,并称它们为Unicode。
显然发现了代码中的问题:编译器使用源文件的编码来生成字符串文本。奇怪的是,它使用了16位的编码,并得到了UTF-8的值,从而产生了错误的字符序列!我在想,如果你把QString打印出来,它是否会以"A“的形式出现。这可能是它被转换回相同的UTF-8之前,你从来没有看到它,尽管编译器显然不理解它。Frank和您已经能够证明,在Ubuntu上,Qt使用了UTF-16。似乎在没有编码(即21位)的情况下,几乎看不到计算机数据中的Unicode字符。"Unicode“构建显然是UTF-16构建。
https://stackoverflow.com/questions/34065001
复制相似问题