Conversão UTF8 para ANSI com Ruby
Pergunta
Eu tenho um script Ruby que gera um arquivo UTF8 CSV remotamente em uma máquina Linux e, em seguida, transfere o arquivo para uma máquina Windows através de SFTP.
Eu, então, precisa abrir este arquivo com o Excel, mas o Excel não conseguir UTF8, então eu sempre precisa abrir o arquivo em um editor de texto que tem a capacidade de converter UTF8 para ANSI.
Eu adoraria fazer isso programaticamente usando Ruby e evitar o passo de conversão manual. Qual é a maneira mais fácil de fazê-lo?
PS: Eu tentei usar iconv, mas não teve sucesso
.Solução
ascii_str = yourUTF8text.unpack("U*").map{|c|c.chr}.join
assumindo que o seu texto realmente se encaixa no conjunto de caracteres ASCII.
Outras dicas
Eu finalmente consegui fazê-lo usando iconv, eu estava apenas atrapalhando os parâmetros. Então, isso é como fazê-lo:
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 }
É isso aí!
Eu tive um problema semelhante tentando gerar arquivos CSV a partir do conteúdo gerado pelo usuário no servidor. Achei o href="https://github.com/norman/unidecoder" rel="noreferrer"> unidecoder gem
Exemplo: Para o nosso caso de uso simples, este bem trabalhado. Pivotal Labs tem um grande post sobre unicode transliteração para ascii discutir isso com mais detalhes. "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"
Desde o Ruby 1.9, há uma maneira mais fácil:
yourstring.encode('ASCII')
Para evitar problemas com inválido (não-ASCII) caracteres que você pode ignorar os problemas:
yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")