Qt 检索Unicode代码点>;U+;来自QChar的FFFF
我有一个应用程序,它应该处理各种各样的字符,并在某些时候显示有关它们的信息。我在QChar、QString等中使用Qt及其固有的Unicode支持Qt 检索Unicode代码点>;U+;来自QChar的FFFF,qt,unicode,astral-plane,codepoint,qchar,Qt,Unicode,Astral Plane,Codepoint,Qchar,我有一个应用程序,它应该处理各种各样的字符,并在某些时候显示有关它们的信息。我在QChar、QString等中使用Qt及其固有的Unicode支持 现在我需要QChar的代码点以便在中查找一些数据,但是QChar的unicode()方法只返回一个ushort(无符号短),它通常是一个从0到65535(或0xFFFF)的数字。有些字符的代码点大于0xFFFF,那么如何获取这些字符呢?我是否缺少一些技巧,或者Qt/QChar目前不支持这些技巧?每个QChar都是UTF-16值,而不是一个完整的Uni
现在我需要QChar的代码点以便在中查找一些数据,但是QChar的unicode()方法只返回一个ushort(无符号短),它通常是一个从0到65535(或0xFFFF)的数字。有些字符的代码点大于0xFFFF,那么如何获取这些字符呢?我是否缺少一些技巧,或者Qt/QChar目前不支持这些技巧?每个
QChar
都是UTF-16值,而不是一个完整的Unicode码点。因此,非BMP字符由两个QChar
代理项对组成。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年就开始讨论这个问题,但经过三年多(!)的讨论,它最终以“超出范围”而没有得到任何解决
解决方案
但是,您可以下载并使用附加到Qt bug报告中的。根据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文档。解决方案似乎包含有文档记录但在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字符的正确信息。Btw,QString文档以“QString类提供Unicode字符串。QString存储16位QChars的字符串,其中每个QChar对应一个Unicode 4.0字符。(代码值大于65535的Unicode字符使用代理项对存储,即两个连续的QChars。)”