【发布时间】:2015-12-03 11:34:30
【问题描述】:
我很惊讶。我开始深入研究QString::data(),同时试图帮助这里的另一个提问者解决 QString 与 ASCII 相关的问题。
我制作了以下代码,它查看每 16 位 QString 数据包,发现像“ä”和“ß”这样的字母似乎以 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。
【问题讨论】:
-
您使用的是哪个操作系统和 Qt 版本?
-
@Meefte Qt 4.8 和 Debian 8 (Jessie)。你有其他结果吗?
-
我在 Windows 7 和 Qt 5.5 上获得了
0 65 'A' 3 | 2 223 '00\u00df' 3 | 4 66 'B' 3 -
字符串文字中的非 ASCII 字符不可移植。不要假设它们会在您的系统中按您期望的那样工作。特别是,您的系统可能使用 UTF-8 进行源编码,但 Qt 在其构造函数中使用
fromAscii。 -
避免源文件编码问题 n.m.提到,尝试使用
QString h = QString::fromLatin1("A\337B"),它可以避免非ascii文字并进行从latin1到QString的显式转换。