Ответ 1
ascii_str = yourUTF8text.unpack("U*").map{|c|c.chr}.join
предполагая, что ваш текст действительно вписывается в набор символов ascii.
У меня есть Ruby script, который удаляет файл 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 файлы из пользовательского контента на сервере. Я нашел 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, обсуждая это более подробно.
Так как ruby 1.9 есть более простой способ:
yourstring.encode('ASCII')
Чтобы избежать проблем с недопустимыми (не ASCII) символами, вы можете игнорировать проблемы:
yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")