我正在尝试使用 Erlang 将来自 iPhone 客户端应用程序的文本(带有表情符号)存储在 MySQL 数据库上。 (进入 varchar 列)
我曾经使用使用 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++ 上
如有任何帮助,我们将不胜感激。
根据要求,这里是存储数据的查询:
UPDATE Table SET c=? WHERE id=?
真的很简单...
最佳答案
都是关于utf-8编码的。在 Erlang 中,字符列表(在您的例子中为 [240,159,152,130]
)通常不进行编码,而是 unicode 代码点。当您检索数据时,您会得到一个包含字符的 utf-8 编码字节的二进制文件。我不知道这种编码发生的确切位置。来自 erlang shell:
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 中处理 unicode 非常简单,列表中的字符通常是 unicode 代码点并且很少被编码,而将它们存储在二进制文件中意味着您必须以某种方式对它们进行编码,因为二进制文件只是字节数组。默认编码是utf-8。在模块 unicode
中有用于在 unicode 列表和二进制文件之间进行转换的函数。
关于mysql - Erlang emysql iPhone 表情符号编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9668647/