Как в Qt преобразовать кодовую точку Unicode U + 1F64B в QString, содержащую ее эквивалентный символ & quot;; & quot ;?

Фон:

Я делаю хеш, который позволит вам найти описание, которое вы видите ниже, передав ему QString, содержащую его символ.

Пример карты персонажей

Я получил полный список соответствующих данных, выглядящих примерно так:

QHash<QString, QString> lookupCharacterDescription;
...
lookupCharacterDescription.insert("003F","QUESTION MARK");
lookupCharacterDescription.insert("0040","COMMERCIAL AT");
lookupCharacterDescription.insert("0041","LATIN CAPITAL LETTER A");
lookupCharacterDescription.insert("0042","LATIN CAPITAL LETTER B");
...
lookupCharacterDescription.insert("1F648","SEE-NO-EVIL MONKEY");
lookupCharacterDescription.insert("1F649","HEAR-NO-EVIL MONKEY");
lookupCharacterDescription.insert("1F64A","SPEAK-NO-EVIL MONKEY");
lookupCharacterDescription.insert("1F64B","HAPPY PERSON RAISING ONE HAND");
...
lookupCharacterDescription.insert("FFFD","REPLACEMENT CHARACTER");
lookupCharacterDescription.insert("FFFE","<not a character>");
lookupCharacterDescription.insert("FFFF","<not a character>");
lookupCharacterDescription.insert("FFFFE","<not a character>");
lookupCharacterDescription.insert("FFFFF","<not a character>");

Теперь очевидно "1F64B" здесь нужно что-то завернуть. Я пытался играть с такими вещами, как 0x1F64B как QChar, но я честно нащупываю здесь в темноте. Я мог бы заставить его работать с более низкими значениями, такими как латинские буквы, но он не работает с 5-символьными адресами.

Вопросы:

  • Как я классифицирую 1F64B?
  • Это считается UTF-32?
  • Как можно обернуть это значение «1F64B», чтобы получить QString («��»)?
  • Будет ли упаковка также работать для более низких значений?

0

Решение

Когда вы используете QString(0x1F64B) это позвонит QString::QString(QChar ch). поскольку QChar это 16-битный тип, это будет усекать значение 0xF64B, и вы получите недопустимый символ, поскольку эта кодовая точка в настоящее время не назначена. Я почти уверен, что вы получите предупреждение о превышении диапазона на этой линии. Вы можете увидеть значение F64B легко в характере если вы увеличиваете масштаб или используете шестнадцатеричный редактор. Так как 0x1F64B не может поместиться в один 16-битный QChar и должен быть представлен суррогатной парой, вы не можете инициализировать строку таким образом.

Ото QString("��") работает, так как он строит строку из другой строки. Вы должны создать строку с такой строкой или вручную, назначив кодовые единицы UTF-8/16.

Это считается UTF-32?

Нет. UTF-32 — это кодировка Unicode, которая использует 32 бита для кодовой единицы. У вас есть только QString, а не пустой байтовый массив, поэтому вам не нужно заботиться о его кодировке (на самом деле это UTF-16).

Как можно обернуть это значение «1F64B», чтобы получить QString («��»)?

Вы не должны иметь дело с числовыми значениями в виде строки. Вместо этого сохраните его как числовой тип

QHash<qint32, QString> lookupCharacterDescription;
lookupCharacterDescription.insert(0x1F64B, "HAPPY PERSON RAISING ONE HAND");

а затем сделать строку, содержащую символ в точке кода 0x1F64B, используйте

uint cp = 0x1F64B;
QString mystr = QString::fromUcs4(&cp, 1);

Будет ли упаковка также работать для более низких значений?

Да, так как UCS4, А.К.А. UTF-32, может хранить любые возможные символы Unicode

В качестве альтернативы вы можете создать персонажа из UTF-16 или UTF-8. U + 1F64B кодируется в UTF-16 как D83D DE4Bили как F0 9F 99 8B в UTF-8, поэтому вы можете использовать любой из следующих

QChar utf16[2] = { 0xD38D, 0xDE4B };
str1 = QString(utf16, 2);
char* utf8[4] = { 0xF0, 0x9F, 0x99, 0x8B };
str2 = QString::fromUtf8(utf8, 4);

Если вы хотите включить строку в ее буквальной форме в исходный код, то подойдет любое из следующих

str1 = QString::fromWCharArray(L"\xD83D\xDE4B");
str2 = QString::fromUtf8("\xF0\x9F\x99\x8B");

Если у вас есть поддержка C ++ 11, просто используйте префикс u8, u а также U для UTF-8, UTF-16 и UTF-32 соответственно

u8"��"u"��"U"��"u8"\U0001F64B"u"\U0001F64B"u"\uD83D\uDE4B"U"\U0001F64B"

Обязательная статья для понимания текста и кодировки: Там нет такого понятия, как обычный текст

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]