如何使QChar.unicode()报告组合字符的utf-16表示?

时间:2012-06-11 09:59:48

标签: c++ qt unicode qstring codepoint

我正在尝试为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值?

2 个答案:

答案 0 :(得分:3)

  1. QString::fromStdString需要ASCII字符串,不进行任何解码。请改用fromLocal8Bit

  2. 您的预期输出错误。例如,Ç是U + 00C7,因此您应该期望C7, C3 87的UTF-8编码!

  3. 如果您修改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 UnicodeQApplication::arguments已经为UTF-16编码,因为您考虑了本地约定。