如何用Elixir将Latin-1转换为UTF-8?

时间:2016-06-24 19:03:28

标签: utf-8 character-encoding elixir

Elixir 1.3.0

Windows 10

Postgrex 0.11.2

Ecto 2.0.1

Postgres 9.4.4

我试图通过Ecto将记录添加到PostgreSQL数据库。当我到达包含\ x0087的字符串时,它会抛出以下错误:

** (Postgrex.Error) ERROR (character_not_in_repertoire): invalid byte sequence for encoding "UTF8": 0x87

我很确定这是文件本身的一个问题,据我所知,它被编码为Latin1。这是我用来打开文件并在其中读取的代码:

:ok = :io.setopts(:standard_io, encoding: :latin1)
File.open!(file)
|> IO.binstream(:line)

该文件打开正常,实际上几行处理得很好,直到它到达包含\ x0087的行。

我能够理解的是如何将使用latin1编码读入的行转换为UTF-8编码。我发现String.normalize似乎可能有助于转换,但我知道我正在抓住稻草。

我将encoding:行的io.setopts参数更改为:utf8,但似乎无法发挥作用。

是否有一些简单的方法将ANSI / Latin1编码的字符串转换为UTF-8编码的字符串?

1 个答案:

答案 0 :(得分:0)

我真的对回答我自己的问题犹豫不决,但我认为使用this Q & A中的技巧也是正确答案。基本上需要从CP-1252转换为UTF-8,然后一切都按预期工作。