7

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

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

4

3 回答 3

7

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

于 2011-08-07T12:43:57.917 回答
3

解决方案似乎在于记录在案但在 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 字符。

于 2017-04-21T16:47:06.253 回答
2

Qt中U+FFFF以外的Unicode字符

QChar本身只支持最多U+FFFF.

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

我在 2011 年就这个问题打开了 QTBUG-18868,但经过三年多(!)的讨论,它最终因为“超出范围”而被关闭,没有任何解决方案。

解决方案

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

此下载包含包装类QUtfString, QUtfChar,它们补充了现有的 Qt 类并允许您执行以下操作QUtfRegExpQUtfStringList

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 文档。

于 2014-04-04T10:28:23.867 回答