我正在尝试为Code page 437编写一个编解码器。我的计划是只传递ASCII字符并使用utf-16值作为关键字映射表中剩余的128个字符。
对于某些组合字符(带点,字母等字母),该字符似乎占用两个QChars。
一个测试程序,它打印程序参数的utf-16值:
#include <iostream>
#include <QString>
using namespace std;
void print(QString qs)
{
for (QString::iterator it = qs.begin(); it != qs.end(); ++it)
cout << hex << it->unicode() << " ";
cout << "\n";
}
int main(int argc, char *argv[])
{
for (int i = 1; i < argc; i++)
print(QString::fromStdString(argv[i]));
}
一些输出:
$ ./utf16 Ç ü é
c3 87
c3 bc
c3 a9
我原本预计
c387
c3bc
c3a9
尝试了QString中可用的各种normalizationsform,但没有人比默认字节少。
由于QChar是2个字节,因此它应该能够在一个对象中保存上述字符的值。为什么QString使用两个QChars?如何获取组合的unicode值?
答案 0 :(得分:3)
QString::fromStdString
需要ASCII字符串,不进行任何解码。请改用fromLocal8Bit
。
您的预期输出错误。例如,Ç
是U + 00C7,因此您应该期望C7,不 C3 87的UTF-8编码!
如果您修改main()
,如下所示,您将获得预期的Unicode代码点。对于每个字符,第一行列出了本地编码(此处为:Utf-8),因为fromStdString
本质上是一个无操作并直接传递所有内容。第二行列出了正确解码的Unicode代码点索引。
$ ./utf16 Ç ü é
c3 87
c7
c3 bc
fc
c3 a9
e9
int main(int argc, char *argv[])
{
for (int i = 1; i < argc; i++) {
print(QString::fromStdString(argv[i]));
print(QString::fromLocal8Bit(argv[i]));
}
}
答案 1 :(得分:0)
回避问题。见QApplication
in Unicode。 QApplication::arguments
已经为UTF-16编码,因为您考虑了本地约定。