Elixir 的 iconv
iconv for Elixir
我下载了一个 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
我该如何解决这个问题?
您这里的数据首先是 UTF-8 编码,然后字节被视为 latin1 编码并再次编码为 UTF-8。
URL 中数据的十六进制转储片段显示:
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)> "ü[=11=]"
<<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
之后使用 |> Enum.drop(1)
删除。
因此以下内容应该适合您:
HTTPoison.get!(url).body
|> :unicode.characters_to_list
|> Enum.drop(1)
|> :erlang.list_to_binary
我下载了一个 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
我该如何解决这个问题?
您这里的数据首先是 UTF-8 编码,然后字节被视为 latin1 编码并再次编码为 UTF-8。
URL 中数据的十六进制转储片段显示:
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)> "ü[=11=]"
<<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
之后使用 |> Enum.drop(1)
删除。
因此以下内容应该适合您:
HTTPoison.get!(url).body
|> :unicode.characters_to_list
|> Enum.drop(1)
|> :erlang.list_to_binary