Как кодировать международные строки с помощью смайликов и специальных символов для хранения в базе данных - PullRequest
0 голосов
/ 24 августа 2018

Я хочу использовать API из игры и хранить имена игроков и кланов в локальной базе данных. Имена могут содержать всевозможные символы и смайлики. Вот только несколько примеров, которые я нашел:

  • ⭐?
  • яαℓαηι
  • نکل
  • 窝 猫
  • 鐵 擊 道 遊 隊
  • ❤✖❤ ♠ ️ ♦ ️ ♣ ️✖

Я использую python для чтения API и записи его в базу данных MySQL. После этого я хочу использовать имена в веб-приложении Node.js.

Каков наилучший способ кодирования этих символов и как я могу сохранить их в базе данных, чтобы впоследствии их можно было правильно отобразить?

Я пытался кодировать строки в python с помощью utf-8:

>>> sample = '蛙喜鄉民CLUB'
>>> sample
'蛙喜鄉民CLUB'
>>> sample = sample.encode('UTF-8')
>>> sample
b'\xe8\x9b\x99\xe5\x96\x9c\xe9\x84\x89\xe6\xb0\x91CLUB'

и сохранение закодированной строки в базе данных mysql с набором символов utf8mb4_unicode_ci .

Когда я сохраняю строку сверху и выбираю ее в инструментальной среде mysql, она отображается следующим образом:

蛙喜鄉民CLUB

Когда я снова читаю эту строку из базы данных в Python (и сохраняю ее в db_str), я получаю:

>>> db_str
èåéæ°CLUB
>>> db_str.encode('UTF-8')
b'\xc3\xa8\xc2\x9b\xc2\x99\xc3\xa5\xc2\x96\xc2\x9c\xc3\xa9\xc2\x84\xc2\x89\xc3\xa6\xc2\xb0\xc2\x91CLUB'

Первый вывод - полная тарабарщина, второй с utf-8 выглядит в основном как закодированная строка сверху, но с добавленными \xc2 или \xc3 между каждым байтом.

Как я могу сохранить такие строки в mysql, чтобы я мог их снова прочитать и правильно отобразить в скрипте python?

Подходит ли моя сортировка базы данных utf8mb4_unicode_ci для такого контента? Или я должен использовать другую кодировку?

1 Ответ

0 голосов
/ 25 августа 2018

Как описано @abarnert в комментарии к вопросу, проблема заключалась в том, что библиотека, используемая для записи строк в кодировке Unicode, не знала, что следует использовать utf-8, и поэтому неправильно кодировала строки.

После добавления charset='utf8mb4' в качестве параметра к соединению mysql строка правильно записывается в нужной кодировке.

Все, что мне нужно было изменить, это

conn = MySQLdb.connect(host, user, pass, db, port)

до

conn = MySQLdb.connect(host, user, pass, db, port, charset='utf8mb4')

и после этого мой подход, описанный в вопросе, сработал безупречно.

edit: после объявления параметра charset='utf8mb4' на объекте соединения больше нет необходимости кодировать строки, поскольку теперь это уже успешно выполняется библиотекой mysqlclient.

...