2017-10-10 38 views
2

爲什麼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

回答

4

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,但在線路上遇到這種情況非常罕見),它在大多數情況下也很快成爲過時的任務。