2016-09-27 3 views
1

Предположим, мы получим charlist из иностранного источника, и она в основном представляет собой строку в некоторых унаследованных 1-байтового кодирования как ISO-8859-2. Существует пакет CodepageX, который упрощает преобразование между различными кодировками, но функция to_string ожидает ввода [binary].Почитаю charlist в странах, не UTF-8 кодировкой

Все стандартные функции библиотеки предположим Latin1 ака ISO-8859-1 ввода кодировки при переходе к utf8 (как to_string, IO.chardata_to_string, "#{}" и т.д.)

То, что я придумал это:

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

который является бит уродливый.

Есть ли надежный и удобный встроенный/идиоматический способ эликсира, чтобы получить string из charlist в известной кодировке?

+0

Это лучше: 'вход |>: erlang.list_to_binary |> Codepagex.to_string (: iso_8859_2)'!? Кажется, что он работает правильно: '[224] |>: erlang.list_to_binary |> Codepagex.to_string! (: Iso_8859_2) # =>" ŕ "'. – Dogbert

+0

@ Dogbert да, это определенно более понятно, поскольку это не связано с подозрительным и избыточным 'to_string |> Codepagex.from_string! (: Iso_8859_1)' conversion и да, он работает правильно. Пожалуйста, отправьте ответ. – mudasobwa

ответ

1

to_string в списке целых чисел в Elixir обрабатывает целые числа как коды Unicode (to_string [960] #=> "π"), в то время как вы хотите обрабатывать каждое целое число в виде байта. В Erlang это можно сделать, используя list_to_binary. Я не мог найти любую обертку для этого в встроенных модулей эликсира, но вы всегда можете позвонить :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) 
"ŕ"