我们正在使用R16B03-1并尝试升级到R17。
如果里面有中文字符, iolist_to_binary
和list_to_binary
就会中断。
我用Google搜索并找到以下链接来解释问题。
Erlang文件的默认编码已从ISO-8859-1更改为UTF-8。 XML文件的编码也已更改为UTF-8
仅当字符串包含代码点< 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
吗?
由于
答案 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).
<<"컮">>