gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:34 26 4
gpt4 key购买 nike

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

对于某些组合字符(带点的字母、波浪号等),该字符似乎占用两个 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 中可用的各种规范化形式,但没有一个比默认的字节数少。

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

最佳答案

  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]));
}
}

关于c++ - 如何使 QChar.unicode() 报告组合字符的 utf-16 表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10977955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com