Преобразование UTF8 в ANSI с Ruby - PullRequest
14 голосов
/ 04 ноября 2008

У меня есть скрипт Ruby, который генерирует файл CSV UTF8 удаленно на машине Linux, а затем передает файл на машину Windows через SFTP.

Затем мне нужно открыть этот файл в Excel, но Excel не получает UTF8, поэтому мне всегда нужно открывать файл в текстовом редакторе, который имеет возможность конвертировать UTF8 в ANSI.

Я бы хотел сделать это программно, используя Ruby, и избегать шага ручного преобразования. Какой самый простой способ сделать это?

PS: я пытался использовать iconv, но безуспешно.

Ответы [ 4 ]

17 голосов
/ 04 ноября 2008
ascii_str = yourUTF8text.unpack("U*").map{|c|c.chr}.join

при условии, что ваш текст действительно помещается в набор символов ascii.

13 голосов
/ 04 ноября 2008

Мне наконец удалось сделать это с помощью iconv, я просто испортил параметры. Итак, вот как вы это делаете:


require 'iconv'

utf8_csv = File.open("utf8file.csv").read

# gotta be careful with the weird parameters order: TO, FROM !
ansi_csv = Iconv.iconv("LATIN1", "UTF-8", utf8_csv).join

File.open("ansifile.csv", "w") { |f| f.puts ansi_csv }

Вот и все!

7 голосов
/ 19 августа 2017

Начиная с ruby ​​1.9 есть более простой способ:

yourstring.encode('ASCII')

Чтобы избежать проблем с недопустимыми (не ASCII) символами, вы можете игнорировать проблемы:

yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")
7 голосов
/ 25 августа 2015

У меня была похожая проблема при попытке создать файлы CSV из пользовательского контента на сервере. Я нашел гем unidecoder , который отлично транслитерирует символы юникода в ascii.

Пример:

"olá, mundo!".to_ascii                 #=> "ola, mundo!"
"你好".to_ascii                        #=> "Ni Hao "
"Jürgen Müller".to_ascii               #=> "Jurgen Muller"
"Jürgen Müller".to_ascii("ü" => "ue")  #=> "Juergen Mueller"

В нашем простом случае это хорошо сработало.

У Pivotal Labs есть отличное сообщение в блоге о транслитерации в юникоде в ascii , где это обсуждается более подробно.

...