QString-UTF8嵌入在16Bits中
QString - UTF8 embedded in 16Bits?
我很惊讶。我开始深入研究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构建。
- 将 Qvector<uint8_t> 转换为 QString
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- C++MySQL连接器没有utf8
- 将 hh:mm:ss.zzz 时间 QString 转换为毫秒的单行函数?
- 从/到 UTF-8/UTF-16 的转换需要(例如:utf8 -> 代码点,然后代码点到 utf16)或(例如:utf8 -> utf16)?
- C++和带有国家符号的文件路径(也许用 UTF8 编码)
- Qt C++ 如何在 1 个命令中砍掉属于 QStringList 成员的 QString 字母
- 为什么使用 QString::right 在字符串开头省略逗号?
- Qt:更新 QString 时自动生成的代码失败
- 如何将 QString 的 QList 分配给列表视图?
- 加倍到 QString 并保存在 QJsonDocument 中
- 如何将包含指数的 QString 转换为C++中的双倍?
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- 是否可以直接将QString输入(例如)googletest的ADD_FAILURE()宏?
- 如何从 QString 中包含的十六进制值中获取 ASCII 字符?
- 将 QAction 的 QString 文本作为参数传递
- 在Qt中读取utf8文件到QString
- QString-UTF8嵌入在16Bits中