从 QChar 检索 Unicode 代码点 > U+FFFF

问题描述 投票:0回答:3

我有一个应用程序应该处理各种字符并在某些时候显示有关它们的信息。我在 QChar、QString 等中使用 Qt 及其固有的 Unicode 支持。

现在我需要 QChar 的代码点才能在 http://unicode.org/Public/UNIDATA/UnicodeData.txt 中查找一些数据,但 QChar 的 unicode() 方法仅返回 ushort (无符号短整型) ,通常是 0 到 65535(或 0xFFFF)之间的数字。有些字符的码位 > 0xFFFF,那么如何获取这些字符呢?我是否缺少一些技巧,或者 Qt/QChar 目前不支持此功能?

qt unicode astral-plane codepoint qchar
3个回答
7
投票

每个

QChar
都是一个 UTF-16 值,而不是完整的 Unicode 代码点。因此,非 BMP 字符由两个
QChar
代理对组成。


3
投票

解决方案似乎存在于已记录但在网络上很少见的代码中。您可以获得十进制形式的 utf-8 值。然后,您可以申请确定单个

QChar
是否足够大。在这种情况下则不然。然后你需要创建两个
QChar's

uint32_t cp = 155222; // a 4-byte Japanese character 
QString str;
if(QChar::requiresSurrogates(cp))
{
    QChar charArray[2];
    charArray[0] = QChar::highSurrogate(cp);
    charArray[1] = QChar::lowSurrogate(cp);
    str =  QString(charArray, 2);
}

生成的

QString
将包含显示补充 utf-8 字符的正确信息。


2
投票

Qt 中 U+FFFF 之外的 Unicode 字符

QChar
本身仅支持最多
U+FFFF
的Unicode字符。

QString
通过连接两个 QChars
(即使用 UTF-16 编码)来支持 
U+FFFF 之外的 Unicode 字符。但是,如果您需要处理 U+FFFF
 以外的字符,QString API 并没有多大帮助。例如,包含单个 Unicode 字符 
U+131F6
 的 QString 实例将返回大小 2,而不是 1。

我早在 2011 年就这个问题打开了

QTBUG-18868,但经过三年多(!)的讨论,它最终以“超出范围”为由关闭,没有任何解决方案。

解决方案

但是,您可以下载并使用

这些 Unicode Qt 字符串包装类,它们已附加到 Qt 错误报告中。根据 LGPL 获得许可。

此下载包含包装类

QUtfString

QUtfChar
QUtfRegExp
QUtfStringList
,它们补充了现有的 Qt 类并允许您执行以下操作:

QUtfString str; str.append(0x1307C); // Some Unicode character beyond U+FFFF Q_ASSERT(str.size() == 1); Q_ASSERT(str[0] == 0x1307C); str += 'a'; Q_ASSERT(str.size() == 2); Q_ASSERT(str[1] == 'a'); Q_ASSERT(str.indexOf('a') == 1);

有关实现、使用和运行时复杂性的更多详细信息,请参阅下载中包含的 API 文档。

© www.soinside.com 2019 - 2024. All rights reserved.