Unicode-символы за пределами U + FFFF в Qt
QChar
сама поддерживает только символы Юникода до U+FFFF
.
QString
поддерживает символы Unicode за пределами U+FFFF
путем объединения двух QChar (то есть с использованием кодировки UTF-16). Тем не менее, API QString не очень вам помогает, если вам нужно обрабатывать символы за пределами U+FFFF
. Например, экземпляр QString, который содержит один символ Unicode U+131F6
, вернет размер 2, а не 1.
Я открыл QTBUG-18868 об этой проблеме еще в 2011 году, но после более чем трех лет (!) Обсуждения она была окончательно закрыта как «выходящая за рамки» без какого-либо решения.
Решение
Тем не менее, вы можете скачать и использовать эти классы обёрток строк Qt Unicode , которые были прикреплены к отчету об ошибках Qt. Лицензировано по лицензии 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, включенную в загрузку.