QString - 嵌入16位的UTF8?

Aar*_*ron 6 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();
}
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.

Cod*_*ker 0

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 版本。

  • Unicode 不是任何位。它只是将数字分配给字符。UTF-16 定义了 16 位代码单元中这些数字的编码。然而,它确实需要至少 21 位来表示所有 Unicode,并且 UTF-16 允许一个或两个代码单元(2 或 4 个字节)对单个 Unicode 代码点进行编码。 (2认同)