Преобразование UTF8 в ANSI с помощью Ruby
Вопрос
У меня есть скрипт Ruby, который удаленно генерирует CSV-файл UTF8 на компьютере с Linux, а затем передает файл на компьютер с Windows через SFTP.
Затем мне нужно открыть этот файл с помощью Excel, но Excel не получает UTF8, поэтому мне всегда нужно открывать файл в текстовом редакторе, который имеет возможность конвертировать UTF8 в ANSI.
Я бы с удовольствием сделал это программно, используя Ruby, и избежал этапа преобразования вручную.Какой самый простой способ это сделать?
PS:Я пытался использовать iconv, но безуспешно.
Решение
ascii_str = yourUTF8text.unpack("U*").map{|c|c.chr}.join
при условии, что ваш текст действительно помещается в набор символов ascii.
Другие советы
Мне наконец удалось сделать это с помощью 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 }
Вот и все!
У меня была аналогичная проблема при попытке сгенерировать CSV-файлы из пользовательского контента на сервере.Я нашел тот самый единый декодер драгоценный камень, который отлично справляется с транслитерацией символов unicode в 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 обсудим это более подробно.
Начиная с ruby 1.9, есть более простой способ:
yourstring.encode('ASCII')
Чтобы избежать проблем с недопустимыми символами (отличными от ASCII), вы можете игнорировать проблемы:
yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")