如何从R16B升级到17?如果里面有中文字符,list_to_binary会中断

时间:2015-05-14 10:03:02

标签: erlang

我们正在使用R16B03-1并尝试升级到R17。

如果里面有中文字符,

iolist_to_binarylist_to_binary就会中断。

我用Google搜索并找到以下链接来解释问题。

  1. http://www.erlang.org/news/71
  2.   

    Erlang文件的默认编码已从ISO-8859-1更改为UTF-8。 XML文件的编码也已更改为UTF-8

    1. http://www.erlang.org/doc/apps/stdlib/unicode_usage.html
    2.   

      仅当字符串包含代码点< 256,可以通过使用ie erlang:iolist_to_binary / 1直接转换为二进制文件,也可以直接发送到端口。如果字符串包含Unicode字符>在255,必须决定编码,并且应该使用unicode将字符串转换为首选编码的二进制文件:characters_to_binary / {1,2,3}。字符串通常不是字节列表,因为它们在Erlang / OTP R13之前。它们是角色列表。字符通常不是字节,它们是Unicode代码点。

      我的问题是,我们必须将所有list_to_binary修改为unicode:characters_to_binary吗?

      由于

1 个答案:

答案 0 :(得分:3)

从以下链接 http://www.erlang.org/doc/man/unicode.html

  

除了在二进制文件中表示代码点或UTF-8的整数之外的其他Unicode编码被称为"外部编码"。 ISO-latin-1编码位于二进制文件和列表中,称为latin1-encoding。

     

建议仅在需要时使用外部编码与外部实体进行通信。在Erlang / OTP环境中工作时,建议在表示Unicode字符时将二进制文件保留为UTF-8。

不需要在所有地方将list_to_binary修改为unicode:characters_to_binary。只需要那些需要与外部世界接口的地方,你不确定字符串是否用utf8表示(或者你确定编码不是utf8)。转换后,可以使用标准BIF。

示例:如果有一个包含字符的列表[52974]。 list_to_binary([52974]).给出了错误的参数异常错误。 但是一旦你做了

A = unicode:characters_to_binary([52974], utf8). <<"컮"&GT;&GT;

完成上述转换后,您可以使用内置函数,这些函数在业务逻辑中更快。

B = binary_to_list(A).
"컮"
list_to_binary(B).
<<"컮">>