Полная поддержка utf8mb4 в Qt для хранения Emoji в MySql таблице?

Суть проблемы:

В Qt парсится файл, в котором есть Emoji символы.

После этого, данные записываются в MySql таблицу типа - InnoDB, в атрибут типа varchar. После добавления в таблицу (да и в самом Qt при дебаге) часть Emoji, такие как: https://emojipedia.org/drop-of-blood/

https://emojipedia.org/tooth/

- не отображаются

Что уже делал:

  • Создание таблицы с указанием кодировки атрибутов:
   CREATE TABLE IF NOT EXISTS `"+tableName+

   "`(filed1 int not null AUTO_INCREMENT, filed2 varchar(30),

   filed3 varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,  

   filed4 varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,

   filed5 varchar(100),PRIMARY KEY(filed1),INDEX USING BTREE(filed1)"");
  • Установка кодировки для БД:
ALTER DATABASE <имя моей базы> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • Установка кодировки в Qt:

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

Мне подсказали, что:

mysql-клиенты, кстати, тоже должны использовать кодировку utf8mb4, иначе на перекодировании туда-сюда emoji тоже потеряются

Отсюда, у меня возникло два вопроса:

  1. Судя по сообщениям этой темы https://stackoverflow.com/questions/25727970/pasting-emoji-in-qt-qtextedit/25732050#25732050 и по данным отладчика - qt захватывает эмодзи в виде escape последовательностей 55358, 56759, но просто не отображает (мне собственно, этого и не надо в редакторе), но если символы присутствуют в строке, почему в таблицу они все равно пишутся некорректно?

  2. https://bugreports.qt.io/browse/QTBUG-60039?focusedCommentId=358330&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-358330 - As you know utf8mb4 is a MySQL define and not a real codec.

- тогда, как mysql-клиенты могут его использовать?

Еще, видел вариант, что после подключения к БД - необходимо первым запросом выполнить:

SET NAMES ("имя кодировки")

Краткая суть вопроса:

Как, работая с Qt, как с MySql клиентом, добиться полной поддержки Emoji символов, при записи в таблицу?


Ответы (1 шт):

Автор решения: BadCatss

Обеспечить полную поддержку символов так и не получилось, пришлось удалять часть эмодзи из строки. Тема про удаление - здесь:

Удалить Emojii символ из строки в Qt?

Коротко:

для удаления симолов эмодзи, необходимо воспользоваться статическим методом QString::fromWCharArray() - куда передать сурогатные пары

QString tmpStr=QString::fromWCharArray(L"\xD83E\xDDB7"); myStr.remove(tmpStr);

→ Ссылка