Conversione di UTF8 in ANSI con Ruby
Domanda
Ho uno script Ruby che genera un file CSV UTF8 in remoto in una macchina Linux e quindi trasferisce il file su una macchina Windows tramite SFTP.
Devo quindi aprire questo file con Excel, ma Excel non ottiene UTF8, quindi ho sempre bisogno di aprire il file in un editor di testo che ha la capacità di convertire UTF8 in ANSI.
Mi piacerebbe farlo a livello di codice usando Ruby ed evitare il passaggio di conversione manuale. Qual è il modo più semplice per farlo?
PS: ho provato a usare iconv ma non ho avuto successo.
Soluzione
ascii_str = yourUTF8text.unpack("U*").map{|c|c.chr}.join
supponendo che il tuo testo si adatti davvero al set di caratteri ASCII.
Altri suggerimenti
Finalmente sono riuscito a farlo usando iconv, stavo solo incasinando i parametri. Quindi, ecco come lo fai:
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 }
Questo è tutto!
Ho avuto un problema simile nel tentativo di generare file CSV dal contenuto generato dall'utente sul server. Ho trovato la unidecoder che fa un buon lavoro di traslitterazione dei caratteri Unicode in ascii.
Esempio:
"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"
Per il nostro semplice caso d'uso, ha funzionato bene.
Pivotal Labs ha un ottimo post sul blog traslitterazione unicode in ascii discuterne in modo più dettagliato.
Dal rubino 1.9 esiste un modo più semplice:
yourstring.encode('ASCII')
Per evitare problemi con caratteri non validi (non ASCII) è possibile ignorare i problemi:
yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")