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

7

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

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


1
顺便说一下,QString文档以"The QString class provides a Unicode character string."开头。QString存储了一串16位的QChars,其中每个QChar对应一个Unicode 4.0字符。(具有大于65535的代码值的Unicode字符使用代理对存储,即两个连续的QChars。) - mlvljr
3个回答

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

3
解决方法似乎在于一段文档中的代码,在网络上很少见到。您可以获取UTF-8值的十进制形式。然后应用它来确定单个QChar是否足够大。在这种情况下不够大,所以需要创建两个QChar。
uint32_t cp = 155222; // a 4-byte Japanese character 
QString str;
if(Qchar::requiresSurrogate(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本身仅支持Unicode字符到U+FFFF

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

我在2011年曾经提出关于此问题的QTBUG-18868,但经过三年多的讨论后,它最终被关闭为“超出范围”,没有任何解决方案。

解决方案

但是,您可以下载并使用这些Unicode Qt字符串包装类,它们已附加到Qt错误报告中。使用LGPL许可证。

此下载包含包装类QUtfStringQUtfCharQUtfRegExpQUtfStringList,这些类补充了现有的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文档,以了解实现、使用和运行时复杂度的详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接