emojis - Erlang emysql iPhone Emoji problema de codificación
emoji iphone descargar (1)
Todo se trata de la codificación utf-8. En Erlang, una lista de caracteres, en su caso [240,159,152,130]
, normalmente no está codificada, pero son los puntos de código Unicode. Cuando recuperaste los datos, obtuviste un binario que contenía bytes de codificación de utf-8 de tus personajes. Exactamente dónde ocurrió esta codificación, no sé. Desde el shell 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]
Manejar unicode en erlang es bastante simple, los caracteres en las listas son generalmente los puntos de código Unicode y muy rara vez están codificados, mientras que su almacenamiento en binarios significa que tienes que codificarlos de alguna manera, ya que los binarios son simplemente matrices de bytes. La codificación predeterminada es utf-8. En el módulo unicode
hay funciones para convertir listas y binarios Unicode.
Estoy tratando de almacenar texto (con emoji) desde una aplicación cliente de iPhone en una base de datos MySQL con Erlang. (En una columna varchar)
Solía hacerlo con un servidor de conexión de socket hecho con C ++ y mysqlpp, funcionaba muy bien. (Es exactamente la misma base de datos, entonces puedo suponer que el problema no proviene de la base de datos )
Sin embargo, decidí pasar todo en Erlang por razones de escalabilidad, y desde entonces, no puedo almacenar y recuperar correctamente emojis.
Estoy usando emysql para comunicarme con mi base de datos.
Cuando estoy almacenando, estoy enviando esta lista a la base de datos:
[240,159,152,130]
Cuando estoy recuperando, aquí lo que obtengo:
<<195,176,194,159,194,152,194,130>>
Hay algunas similitudes, obviamente, podemos ver 159, 152 y 130 en ambas líneas, pero no 240. No sé de dónde vienen 195, 176 y 194.
Pensé en cambiar la codificación emysql al crear el grupo de conexiones.
emysql:add_pool(my_db, 3, "login", "password", "db.mydomain.com", 3306, "MyTable", utf8)
Pero parece que puedo encontrar el átomo adecuado para la codificación utf32. (Lo interesante es que no he establecido ninguna codificación en C ++ y mysqlpp, funcionó de la caja).
He hecho algunas pruebas ...
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)
Una información más, estoy usando una declaración preparada en Erlang, mientras que no estoy en C ++
Cualquier ayuda sería apreciada.
Como se solicitó, aquí la consulta para almacenar datos:
UPDATE Table SET c=? WHERE id=?
Muy simple realmente ...