读取非utf-8编码的charlist

时间:2016-09-27 06:32:02

标签: string encoding character-encoding elixir

假设我们从外部源获取 charlist ,它基本上代表一些传统的1字节编码中的字符串,如ISO-8859-2。有一个CodepageX包,可以简化不同编码之间的转换,但是to_string函数需要[binary]作为输入。

转换为Latin1时,所有标准库函数都假设ISO-8859-1又称utf8输入编码(如to_stringIO.chardata_to_string"#{}"等。)

我想出的是:

input
  |> to_string
  |> Codepagex.from_string!(:iso_8859_1)
  |> Codepagex.to_string!(:iso_8859_2) # target encoding

这有点难看。

是否有任何强大且方便的内置/惯用的灵丹妙药以已知编码方式从 string 中获取 charlist ? / p>

1 个答案:

答案 0 :(得分:1)

Elixir中的整数列表上的

to_string将整数视为Unicode代码点(to_string [960] #=> "π"),而您希望将每个整数视为一个字节。在Erlang中,可以使用list_to_binary完成此操作。我在Elixir的内置模块中找不到任何包装器,但你可以随时拨打:erlang.list_to_binary

iex(1)> [224] |> :erlang.list_to_binary
<<224>>
iex(2)> inspect ([224] |> to_string), binaries: :as_binaries
"<<195, 160>>"
iex(3)> [224] |> :erlang.list_to_binary |> Codepagex.to_string!(:iso_8859_1)
"à"
iex(4)> [224] |> :erlang.list_to_binary |> Codepagex.to_string!(:iso_8859_2)
"ŕ"