2008-11-04 206 views
12

我有一個Ruby腳本,它可以在Linux計算機上遠程生成UTF8 CSV文件,然後通過SFTP將文件傳輸到Windows計算機。使用Ruby將UTF8轉換爲ANSI

然後我需要用Excel打開這個文件,但是Excel沒有得到UTF8,所以我總是需要在能夠將UTF8轉換爲ANSI的文本編輯器中打開該文件。

我很想用Ruby來編程,避免手動轉換步驟。最簡單的方法是什麼?

PS:我嘗試過使用iconv,但沒有成功。

回答

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

假設您的文本確實符合ascii字符集。

+0

那做它,以及它根本不需要使用iconv。謝謝! – Dema 2008-11-04 20:35:53

13

我終於設法使用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 } 

就是這樣!

5

我有一個類似的問題,試圖從服務器上的用戶生成內容生成CSV文件。我發現了unidecoder寶石,它可以很好地將unicode字符轉換爲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 transliteration to ascii上有一篇很棒的博客文章,詳細討論了這一點。

2

由於紅寶石1.9還有一個更簡單的方法:

yourstring.encode('ASCII') 

爲了避免無效的(非ASCII)問題的字符,你可以忽略的問題:

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