Подтвердить что ты не робот

Преобразование UTF8 в ANSI с помощью Ruby

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

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

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

PS: Я пробовал использовать iconv, но не имел успеха.

4b9b3361

Ответ 1

ascii_str = yourUTF8text.unpack("U*").map{|c|c.chr}.join

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

Ответ 2

Мне, наконец, удалось это сделать с помощью 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 }

Что это!

Ответ 3

У меня была аналогичная проблема, пытаясь генерировать CSV файлы из пользовательского контента на сервере. Я нашел unidecoder gem, который отлично справляется с транслитерацией символов юникода в 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 имеет отличную запись в блоге транслитерация unicode в ascii, обсуждая это более подробно.

Ответ 4

Так как ruby ​​1.9 есть более простой способ:

yourstring.encode('ASCII')

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

yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")