В Qt, как мне преобразовать кодовую точку Unicode U+1F64B в QString, содержащую ее эквивалентный символ ""?
Фон:
Я делаю хеш, который позволит вам найти описание, которое вы видите ниже, передав ему 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("")?
- Будет ли упаковка также работать для более низких значений?
1 ответ
Когда вы используете 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, AKA UTF-32, может хранить любые возможные символы Юникода
В качестве альтернативы вы можете создать персонажа из 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"
Обязательная статья для понимания текста и кодировки: нет такого понятия, как обычный текст