【问题标题】:Erlang emysql iPhone Emoji Encoding IssueErlang emysql iPhone 表情符号编码问题
【发布时间】:2012-03-28 22:41:48
【问题描述】:

我正在尝试使用 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=?

真的很简单……

【问题讨论】:

  • 向我们展示您从 Erlang 端发送到数据库的查询。准确地向我们展示您打算写入数据库的内容。 VARCHAR2 我假设持有一个字符串,但您正在发送一个 erlang 列表!!!!向我们展示更多。
  • 我很确定 Erlang 中的字符串是列表(带有可打印字符)...不是吗?
  • Erlang 中的字符串可以是列表或二进制文件或两者的组合。
  • 但是,他发送的内容:[240,159,152,130] 根本不是可打印字符的列表,不幸的是:)
  • 我已将 SQL 连接的编码语言设置为 latin1,因为一切正常。

标签: mysql encoding erlang emoji


【解决方案1】:

这都是关于 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 列表和二进制文件之间进行转换的函数。

【讨论】:

  • 这显然是一个编码问题,有没有办法确定字符串是 latin1 还是 unicode 编码的天气?
  • 不幸的是,不,但只需确保未对 String 进行编码。尽管将数据发送给您可能会很困难。但是,如果您收到它作为二进制文件,那么您就会知道它是经过编码的,否则就不可能。
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 2019-05-26
  • 1970-01-01
  • 2017-10-28
  • 2023-03-04
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多