Я делаю хеш, который позволит вам найти описание, которое вы видите ниже, передав ему 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
? Когда вы используете 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"
Обязательная статья для понимания текста и кодировки: Там нет такого понятия, как обычный текст
Других решений пока нет …