Erlang emysql iPhone Emoji Проблема с кодировкой - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь сохранить текст (с эмодзи) из клиентского приложения iPhone в базе данных MySQL с Erlang. (В колонну варчаров)

Раньше я делал это с сервером соединений с сокетами, работавшим на C ++ и mysqlpp, он работал отлично. (Это точно такая же база данных, поэтому Могу предположить, что проблема не в базе данных )

Однако я решил передать все на Erlang по соображениям масштабируемости, и, поскольку я не могу правильно хранить и получать смайлики.

Я использую emysql для связи с моей базой данных.

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

[240,159,152,130]

Когда я получаю, вот что я получаю:

<<195,176,194,159,194,152,194,130>>

Очевидно, что есть некоторое сходство, мы можем видеть 159, 152 и 130 на обеих линиях, но нет 240. Я не знаю, откуда берутся 195, 176 и 194.

Я думал об изменении кодировки emysql при создании пула соединений.

 emysql:add_pool(my_db, 3, "login", "password", "db.mydomain.com", 3306, "MyTable", utf8)

Но я могу найти подходящий атом для кодировки utf32. (Интересно, что я не установил никакой кодировки на C ++ и mysqlpp, она работала из коробки).

Я сделал несколько тестов ...

storing from C++, retrieving from C++ (Works fine)
storing from Erlang, retrieving from Erlang (Does not work)
storing from Erlang, retrieving from C++ (Does not work)
storing from C++, retrieving from Erlang (Does not work)

Еще одна информация, я использую подготовленный оператор на Erlang, а я не на C ++

Любая помощь будет оценена.

AS запрашивается, вот запрос для хранения данных:

UPDATE Table SET c=? WHERE id=?

Довольно просто на самом деле ...

1 Ответ

1 голос
/ 13 марта 2012

Все дело в кодировке utf-8.В Erlang список символов, в вашем случае [240,159,152,130], обычно не кодируется, а представляет собой кодовые точки Юникода.Когда вы получили данные, вы получили двоичный файл, содержащий байты кодировки utf-8 ваших символов.Где именно произошла эта кодировка, я не знаю.Из оболочки erlang:

10> Bin = <<195,176,194,159,194,152,194,130>>.   
<<195,176,194,159,194,152,194,130>>
11> <<M/utf8,N/utf8,O/utf8,P/utf8,R/binary>> = Bin.
<<195,176,194,159,194,152,194,130>>
12> [M,N,O,P].
[240,159,152,130]

Обработка юникода в erlang довольно проста, символы в списках, как правило, представляют собой кодовые точки юникода и очень редко кодируются, в то время как хранение их в двоичных файлах означает, что вы должны кодировать их в некоторыхКстати, в качестве двоичных файлов используются только массивы байтов.Кодировка по умолчанию - utf-8.В модуле unicode есть функции для преобразования между списками юникода и двоичными файлами.

...