2008-11-04 210 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: "_")