我有一个Ruby脚本,可以在Linux机器上远程生成UTF8 CSV文件,然后通过SFTP将文件传输到Windows机器。
然后我需要用Excel打开这个文件,但Excel没有得到UTF8,所以我总是需要在文本编辑器中打开文件,该编辑器能够将UTF8转换为ANSI。
我希望使用Ruby以编程方式执行此操作并避免手动转换步骤。最简单的方法是什么?
PS:我尝试使用iconv但没有成功。
答案 0 :(得分:17)
ascii_str = yourUTF8text.unpack("U*").map{|c|c.chr}.join
假设您的文本确实适合ascii字符集。
答案 1 :(得分: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 }
就是这样!
答案 2 :(得分:7)
我尝试从服务器上的用户生成内容生成CSV文件时遇到类似问题。我找到了unidecoder 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在unicode transliteration to ascii上有一篇很棒的博客文章,详细讨论了这个问题。
答案 3 :(得分:7)
从ruby 1.9开始,有一种更简单的方法:
yourstring.encode('ASCII')
为避免无效(非ASCII)字符出现问题,您可以忽略这些问题:
yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")