String.to_atom将底层erlang.binary_to_atom编码选项硬编码为:utf8,为什么?

问题描述:

为什么String.to_atom将编码选项硬编码为:utf8?String.to_atom将底层erlang.binary_to_atom编码选项硬编码为:utf8,为什么?

https://github.com/elixir-lang/elixir/blob/d6bb3342b7ea8b921b3d4b69f65064c4158c99d7/lib/elixir/lib/string.ex#L1927 def to_atom(string) do :erlang.binary_to_atom(string, :utf8) end

Erlang的​​可用编码选项有:

latin1 | unicode | utf8 http://erlang.org/documentation/doc-8.0-rc1/erts-8.0/doc/html/erlang.html#binary_to_atom-2

TL; DR

由于宇宙二郎最终沉降上UTF-到处都是8。

讨论

latin1会消失,并在很大程度上是UTF-8的一个子集(除了几个字符),unicode是一个古老的别名utf8,而留给我们的只是一个普遍适用的选项: utf8。这很重要,因为UTF-8原子(和字符串)是Erlang内部以及Elixir内部的前进方向。

如果在旧的数据处理非UTF-8编码,然后将其之前你的电话转换为binary_to_atom/2

这也落在与Erlang的标准库的更新stringunicode模块切换线 - 这可以几十年不确定性后最后定居在UTF-8作为一个普遍接受的标准(因为编码是很难和当Erlang被发明时,对此并没有太多的一致意见)。

上的编码实践

我在日本的主要处理业务数据,它的一些很老的工作一个词,它的一些在真的疯了编码。我倾向于使用Erlang编写代码(我更喜欢小语言)。当一些上了年纪的字符串处理函数和unicode模块被写入字符串分为两类:

  • 的ASCII码点列表(即含蓄地延伸到包括LATIN1相当多的,因为时间,好吧,欧洲语言是一种常见的使用方式,CJK当时是一个狂野的混乱)
  • 一些醒来的龙火和霜冻僵尸的噩梦(因为关于其他任何事情都没有一致意见,而且从技术上来说,不准确的“标准”)

时代已更改。现在我们知道字符串几乎总是以UTF-8编码,而Unixverse中的所有内容最终都在这个问题上解决了,因为它拥有(几乎)所有其他有意义的系统都可以解决这个问题(如果不是内部的,然后通过可在UTF-16和UTF-8之间选择的健壮检测库)。

的情况下,你实际上有非UTF-8的数据那么你知道这是事实,应该把它发送到一个通用的功能,如binary_to_atom/2之前您的数据转换。我实际上认为我们应该接下来转向包括binary_to_atom/1,并且从Erlang R20(yay!)开始逐步淘汰binary_to_atom/2 - which is what has already happened with list_to_atom/1

那么这是如何影响你的代码?

当您开始使用古代编码处理时,您的代码的复杂性突然爆炸,并且需要立即包含该代码,以防感染您的整个代码库中的精神错乱。做到这一点的最佳方式是保持您的业务系统以外的疯狂,并在边缘进行转换。每当我们处理以疯狂编码形式出现的旧数据时我们已经知道并为此做好了准备 - 所以我们明确地将其转换为UTF-8,以便在系统后面再遇到任何问题。

你可能会想,“他们为什么不检测每个字符串的编码?”唉,没有正确的方法来检测字符串编码。只有高度的自信才是不可能的。由于绝大多数今天生成的数据是UTF-8(或UTF-16,但在线路上遇到这种情况非常罕见),它在大多数情况下也很快成为过时的任务。