【问题标题】:iconv for Elixir长生不老药的 iconv
【发布时间】:2017-11-05 18:35:50
【问题描述】:

我下载了一个 CSV 文件并使用以下代码保存:

body = HTTPoison.get!(url).body 
       |> String.replace("ü", "ü") 
       |> String.replace("ö", "ö")
File.write!("/tmp/example.csv", body)

String.replace/3ü 替换ü 当然不是一个好办法。 HTTPoison 告诉我正文是{"Content-Type", "csv;charset=utf-8"}

如果没有String.replace/3,我该如何解决这个问题?

【问题讨论】:

  • 您尝试过github.com/tallakt/codepagex 吗(从未尝试过,但它的 README 说它是“100% 纯 Elixir 中的 iconv”,这听起来像您要找的东西)?
  • 可以分享网址吗?

标签: utf-8 elixir iconv


【解决方案1】:

这里的数据首先是 UTF-8 编码的,然后字节被视为 latin1 编码并再次编码为 UTF-8。

来自该 URL 中数据的十六进制转储 sn-p 显示:

00007d20: 2c22 222c 2c2c 224f 7269 6769 6e3a 2044  ,"",,,"Origin: D
00007d30: c383 c2bc 7373 656c 646f 7266 222c 224b  ....sseldorf","K
00007d40: 6579 776f 7264 733a 204c 6173 7420 4d69  eywords: Last Mi

ü 被编码为 <<0xc3, 0x83, 0xc2, 0xbc>> 可能是这样创建的:

iex(1)> "ü\0"
<<195, 188, 0>>
iex(2)> <<195::utf8, 188::utf8>> == <<0xc3, 0x83, 0xc2, 0xbc>>
true

要反转此过程,您可以使用:unicode.characters_to_list:erlang.list_to_binary 的组合。

iex(3)> <<0xc3, 0x83, 0xc2, 0xbc>> |> :unicode.characters_to_list |> :erlang.list_to_binary
"ü"

该 URL 的开头还包含一个 BOM:

00000000: efbb bf22 5a75 7069 6422 2c22 5072 6f67  ..."Zupid","Prog
          ^^^^ ^^
00000010: 7261 6d49 6422 2c22 4d65 7263 6861 6e74  ramId","Merchant
00000020: 5072 6f64 7563 744e 756d 6265 7222 2c22  ProductNumber","

这可以在:unicode.characters_to_list 之后使用|&gt; Enum.drop(1) 删除。

所以以下内容应该适合你:

HTTPoison.get!(url).body
|> :unicode.characters_to_list
|> Enum.drop(1)
|> :erlang.list_to_binary

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多