UTF-8二进制文件必须在Erlang的二进制文字中包含/ utf8吗?

Str*_*s3D 6 unicode binary erlang encoding utf-8

在erlang中,定义UTF-8二进制字符串时,我需要在二进制文字中指定编码,如下所示:

Star = <<"?"/utf8>>.
> <<226,152,133>>
io:format("~ts~n", [Star]).
> ?
> ok
Run Code Online (Sandbox Code Playgroud)

但是,如果/utf8省略了编码,则无法正确处理unicode字符:

Star1 = <<"?">>.
> <<5>>
io:format("~ts~n", [Star1]).
> ^E
> ok
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以创建这样的文字二进制字符串,而不必/utf8在我创建的每个二进制文件中都指定?我的代码有很多这样的二进制文件,事情变得很混乱。有没有办法为二进制文件设置某种默认编码?

Sou*_*lls 6

这可能是 Erlang 字符串和列表的歧义的结果。当您输入 时<<"?">>,Erlang 实际看到的是<<[9733]>>,当然,它只是一个包含整数的列表。因此,我相信在这种情况下,Erlang 会将 9733 编码为一个整数,很可能是 16 位(尽管我肯定会错)。

/utf8标志向 Erlang 表明这应该是一个 UTF8 字符串,因此向 VM 提供了关于如何最好地编码它遇到的整数的提示。

  • 注意:Erlang 不接受语法 `&lt;&lt;[9733]&gt;&gt;`,但所述语法与您的示例等效。字符串的二进制语法 (`&lt;&lt;"foo"&gt;&gt;`) 可能采用二进制语法 (`&lt;&lt;"foo"/binary&gt;&gt;`),如果是这样,将逐字节消耗字符串内容。同样值得注意的是,`&lt;&lt;9733/utf8&gt;&gt;` 也会生成您期望的字符串,因此 utf8 标志不仅可以用于字符串。 (2认同)