Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 检索Unicode代码点>;U+;来自QChar的FFFF_Qt_Unicode_Astral Plane_Codepoint_Qchar - Fatal编程技术网

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

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、QString等中使用Qt及其固有的Unicode支持


现在我需要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。)”