Получить кодовые точки Unicode> U + FFFF из QChar - PullRequest
7 голосов
/ 07 августа 2011

У меня есть приложение, которое должно работать со всеми видами символов и в какой-то момент отображать информацию о них.Я использую Qt и присущую ему поддержку Unicode в QChar, QString и т. Д.

Теперь мне нужна кодовая точка QChar, чтобы искать некоторые данные в http://unicode.org/Public/UNIDATA/UnicodeData.txt,, но только в методе unicode () QCharвозвращает ushort (unsigned short), который обычно является числом от 0 до 65535 (или 0xFFFF).Есть символы с кодами> 0xFFFF, так как мне их получить?Есть ли какой-то трюк, которого я пропускаю или в настоящее время он не поддерживается Qt / QChar?

Ответы [ 3 ]

6 голосов
/ 07 августа 2011

Каждый QChar является значением UTF-16, а не полной кодовой точкой Юникода. Поэтому не-BMP символы состоят из двух QChar суррогатных пар.

2 голосов
/ 04 апреля 2014

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, включенную в загрузку.

1 голос
/ 21 апреля 2017

Решение заключается в коде, который задокументирован, но не встречается в Интернете. Вы можете получить значение utf-8 в десятичной форме. Затем вы подаете заявку, чтобы определить, является ли один QChar достаточно большим. В этом случае это не так. Затем вам нужно создать два QChar's.

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.

...