2

我正在尝试为Code page 437编写编解码器。我的计划是只传递 ASCII 字符并将剩余的 128 个字符映射到一个表中,使用 utf-16 值作为键。

对于某些组合字符(带点的字母、波浪线等),该字符似乎占据了两个 QChar。

打印程序参数的 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 中可用的各种规范化形式,但没有人的字节数比默认值少。

由于 QChar 是 2 个字节,它应该能够将上述字符的值保存在一个对象中。为什么 QString 使用两个 QChar?如何获取组合的 unicode 值?

4

2 回答 2

3
  1. QString::fromStdString需要一个 ASCII 字符串并且不进行任何解码。改为使用fromLocal8Bit

  2. 您的预期输出是错误的。例如,Ç是 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]));
    }
}
于 2012-06-11T10:54:31.643 回答
0

只是回避问题。见QApplicationUnicodeQApplication::arguments考虑到本地约定,已经为您进行了 UTF-16 编码。

于 2012-06-11T14:17:40.760 回答