【问题标题】:Read a charlist in non utf-8 encoding以非 utf-8 编码读取字符列表
【发布时间】:2016-09-27 15:01:11
【问题描述】:

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

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

我想出的是:

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

有点丑。

是否有任何健壮且方便的内置/惯用的长生不老药方法以已知编码从 charlist 中获取 string

【问题讨论】:

  • 这样更好吗:input |> :erlang.list_to_binary |> Codepagex.to_string!(:iso_8859_2)?似乎工作正常:[224] |> :erlang.list_to_binary |> Codepagex.to_string!(:iso_8859_2) #=> "ŕ".
  • @Dogbert 是的,这肯定更清楚,因为它不涉及可疑和多余的to_string |> Codepagex.from_string!(:iso_8859_1) 转换,是的,它工作正常。请发布答案。

标签: string encoding character-encoding elixir


【解决方案1】:

to_string 在 Elixir 的整数列表中将整数视为 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)
"ŕ"

【讨论】:

    猜你喜欢
    • 2013-07-04
    • 1970-01-01
    • 2017-08-29
    • 2014-06-09
    • 2011-12-04
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多