我有一个 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 文件时遇到了类似的问题。我发现了unicodecoder 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 音译为 ascii的博文,对此进行了更详细的讨论。
由于 ruby 1.9 有一个更简单的方法:
yourstring.encode('ASCII')
为避免无效(非 ASCII)字符出现问题,您可以忽略这些问题:
yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")