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

.
Foi útil?

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:

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

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: "_")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top