在erlang中,在定义UTF-8二进制字符串时,我需要在二进制文字中指定编码,如下所示:
Star = <<"★"/utf8>>.
> <<226,152,133>>
io:format("~ts~n", [Star]).
> ★
> ok
但是,如果省略/utf8
编码,则无法正确处理unicode字符:
Star1 = <<"★">>.
> <<5>>
io:format("~ts~n", [Star1]).
> ^E
> ok
有没有一种方法可以创建像这样的文字二进制字符串而无需在我创建的每个二进制文件中指定/utf8
?我的代码有很多像这样的二进制文件,事情变得非常混乱。有没有办法为二进制文件设置某种默认编码?
答案 0 :(得分:4)
这可能是Erlang字符串和列表含糊不清的结果。当您输入<<"★">>
时,Erlang实际看到的是<<[9733]>>
,当然,这只是一个包含整数的列表。因此,我相信在这种情况下Erlang会将9733编码为整数,最有可能是16位(尽管我当然可能错了)。
/utf8
标志向Erlang指示这应该是一个UTF8字符串,从而向VM提供有关如何最好地编码它遇到的整数的提示。