我很惊讶.我开始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();
}
Run Code Online (Sandbox Code Playgroud)
qDebug()告诉我的是:
0 65 'A' 4
2 195 'Ã' 4
4 159 '' 4
6 66 'B' 4
Run Code Online (Sandbox Code Playgroud)
请注意,'ß'似乎是UTF-8编码,同时仍然对编码的两个部分使用16位.
195 159是'ß'的UTF-8编码.
我的char图告诉我'ß'的UTF-16表示应该是0x00DF.这就是我希望得到的.
另请注意,QString::size()
报告的可疑大小为4而不是3.
QString 数据在内部存储为 Unicode。来自 qt 文档:
QString str = "Hello";
Run Code Online (Sandbox Code Playgroud)
“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 版本。从百万元起:
"Unicode UTF-16 编码
将 Unicode 字符表示为 16 位整数序列。您的应用程序可以使用 UnicodeEncoding 类在字符与 UTF-16 编码之间进行转换。
UTF-16 通常在本机使用,如 Microsoft.Net char 类型、Windows WCHAR 类型和其他常见类型。最常见的 Unicode 代码点仅占用一个 UTF-16 代码点(2 个字节)。Unicode 补充字符 U+10000 及更大字符仍需要两个 UTF-16 代理代码点。”
发现于.NET Framework 3.5 - 使用 Unicode 编码。
因此,M$ 通常在内部使用 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 版本。