14

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

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

我很想使用 Ruby 以编程方式执行此操作,并避免手动转换步骤。最简单的方法是什么?

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

4

4 回答 4

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

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

于 2008-11-04T20:31:47.350 回答
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 }

就是这样!

于 2008-11-04T20:33:04.743 回答
8

我在尝试从服务器上的用户生成内容生成 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的博文,对此进行了更详细的讨论。

于 2015-08-25T00:32:18.513 回答
8

由于 ruby​​ 1.9 有一个更简单的方法:

yourstring.encode('ASCII')

为避免无效(非 ASCII)字符出现问题,您可以忽略这些问题:

yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")
于 2017-08-18T21:30:24.120 回答