检索Unicode代码点>来自QChar的U + FFFF

时间:2011-08-07 12:41:24

标签: qt unicode astral-plane codepoint qchar

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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,但经过三年多(!)的讨论,它终于被关闭了,超出范围"没有任何决议。

解决方案

但是,您可以下载并使用已附加到Qt错误报告中的these Unicode Qt string wrapper classes。根据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文档。

答案 2 :(得分:1)

解决方案似乎存在于已记录但在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字符的正确信息。