从 QChar 检索 U+FFFF > Unicode 码位



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

现在我需要一个QChar的代码点,以便在http://unicode.org/Public/UNIDATA/UnicodeData.txt中查找一些数据,但是QChar的unicode()方法只返回一个ushort (unsigned short),通常是一个从0到65535(或0xFFFF)的数字。有代码点> 0xFFFF的字符,那么我如何得到这些?是否有一些技巧我错过或这是目前不支持的Qt/QChar?

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

解决方案似乎存在于文档化但在Web上不常见的代码中。您可以获得十进制形式的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字符的正确信息。

Qt中U+FFFF以外的Unicode字符

QChar本身只支持到U+FFFF的Unicode字符。

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

我早在2011年就打开了关于这个问题的QTBUG-18868,但经过三年多的讨论,它最终以"超出范围"而关闭,没有任何解决方案。

解决方案然而,你可以下载并使用这些Unicode Qt字符串包装类,它们已经附在Qt错误报告中。

此下载包含包装器类QUtfString, QUtfChar, QUtfRegExpQUtfStringList,它们补充了现有的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文档

相关内容

  • 没有找到相关文章

最新更新