ruby utf-8 ansi iconv

Convirtiendo UTF8 a ANSI con Ruby



encoding ruby (4)

Tengo un script de Ruby que genera un archivo UTF8 CSV de forma remota en una máquina Linux y luego transfiere el archivo a una máquina de Windows a través de SFTP.

Entonces necesito abrir este archivo con Excel, pero Excel no tiene UTF8, así que siempre necesito abrir el archivo en un editor de texto que tenga la capacidad de convertir UTF8 a ANSI.

Me encantaría hacer esto programáticamente usando Ruby y evitar el paso de conversión manual. ¿Cuál es la forma más fácil de hacerlo?

PD: Intenté usar iconv pero no tuve éxito.


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

asumiendo que tu texto realmente encaja en el juego de caracteres ascii.


Finalmente logré hacerlo usando iconv, solo estaba estropeando los parámetros. Entonces, así es como lo haces:

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 }

¡Eso es!


Tuve un problema similar al intentar generar archivos CSV a partir de contenido generado por el usuario en el servidor. Encontré la gema unidecoder que hace un buen trabajo de transcripción de caracteres unicode en ascii.

Ejemplo:

"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"

Para nuestro caso de uso simple, esto funcionó bien.

Pivotal Labs tiene una excelente publicación de blog sobre la transcripción de unicode a ascii discutiendo esto con más detalle.


Desde ruby ​​1.9 hay una manera más fácil:

yourstring.encode(''ASCII'')

Para evitar problemas con caracteres no válidos (que no sean ASCII), puede ignorar los problemas:

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