使用Ruby将UTF8转换为ANSI

使用Ruby将UTF8转换为ANSI,ruby,utf-8,ansi,iconv,Ruby,Utf 8,Ansi,Iconv,我有一个Ruby脚本,它在Linux机器上远程生成UTF8 CSV文件,然后通过SFTP将文件传输到Windows机器 然后我需要用Excel打开这个文件,但是Excel没有UTF8,所以我总是需要在一个文本编辑器中打开这个文件,该编辑器能够将UTF8转换为ANSI 我希望使用Ruby以编程方式完成这项工作,并避免手动转换步骤。最简单的方法是什么 PS:我尝试使用iconv,但没有成功 ascii_str = yourUTF8text.unpack("U*").map{|c|c.chr}.joi

我有一个Ruby脚本,它在Linux机器上远程生成UTF8 CSV文件,然后通过SFTP将文件传输到Windows机器

然后我需要用Excel打开这个文件,但是Excel没有UTF8,所以我总是需要在一个文本编辑器中打开这个文件,该编辑器能够将UTF8转换为ANSI

我希望使用Ruby以编程方式完成这项工作,并避免手动转换步骤。最简单的方法是什么

PS:我尝试使用iconv,但没有成功

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

假设您的文本确实适合ascii字符集。

我最终使用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 }

就这样

我在尝试从服务器上用户生成的内容生成CSV文件时遇到了类似的问题。我发现gem在将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有一篇很好的博客文章详细讨论了这一点。

自从ruby 1.9以来,有一种更简单的方法:

yourstring.encode('ASCII')
要避免出现无效(非ASCII)字符的问题,可以忽略这些问题:

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

这样做也很好,根本不需要使用iconv。谢谢注意,如果
c
大于255,它将失败(因为它超出了ASCII范围)。为了修复Sam遇到的非ASCII错误,可以使用以下命令:yourUTF8text.unpack(“U*”).map{c | c.chr rescue'}.join