如何在Ruby中将字符串从windows-1252转换为utf-8?

时间:2009-06-04 17:13:00

标签: windows ruby ms-access encoding character-encoding

我正在Windows XP上使用Ruby 1.8.6将一些数据从MS Access 2003迁移到MySQL 5.0(编写Rake任务来执行此操作)。

原来Windows字符串数据编码为windows-1252,Rails和MySQL都假定utf-8输入,因此一些字符,如撇号,正在被破坏。它们最终会变成“a”,重点在于它们之类的东西。

有没有人知道将windows-1252字符串转换为utf-8的工具,库,系统,方法,仪式,咒语或咒语?

5 个答案:

答案 0 :(得分:10)

对于Ruby 1.8.6,看起来你可以使用Ruby Iconv,它是标准库的一部分:

Iconv documentation

根据此helpful article,您似乎至少可以从字符串中清除不需要的win-1252字符,如下所示:

ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
valid_string = ic.iconv(untrusted_string + ' ')[0..-2]

然后可能会尝试进行完全转换:

ic = Iconv.new('UTF-8', 'WINDOWS-1252')
valid_string = ic.iconv(untrusted_string + ' ')[0..-2]

答案 1 :(得分:9)

如果您使用的是Ruby 1.9 ......

string_in_windows_1252 = database.get(...)
# => "Fåbulous"

string_in_windows_1252.encoding
# => "windows-1252"

string_in_utf_8 = string_in_windows_1252.encode('UTF-8')
# => "Fabulous"

string_in_utf_8.encoding
# => 'UTF-8'

答案 2 :(得分:3)

HY,

我遇到了同样的问题。

这些提示帮助我获得了支持:

请务必检查正确的编码名称,以便正确提供转换工具。 如有疑问,您可以使用以下命令获取iconv或recode支持的编码列表:

$ recode -l

$ iconv -l

始终从原始文件开始,并编码样本以使用:

$ recode windows-1252..u8 < original.txt > sample_utf8.txt

$ iconv -f windows-1252 -t utf8 original.txt -o sample_utf8.txt

安装Ruby1.9,因为它在编码方面可以帮到你很多。即使您不在程序中使用它,也可以始终启动irb1.9会话并选择字符串以查看输出结果。 File.open在Ruby 1.9中有一个新的'mode'参数。用它! 这篇文章有很多帮助:http://blog.nuclearsquid.com/writings/ruby-1-9-encodings

File.open('original.txt', 'r:windows-1252:utf-8')
# This opens a file specifying all encoding options. r:windows-1252 means read it as windows-1252. :utf-8 means treat it as utf-8 internally.

玩得开心,发誓!

答案 3 :(得分:2)

如果要转换名为win1252file的文件,请在unix OS上运行:

$ iconv -f windows-1252 -t utf-8 win1252_file > utf8_file

你应该能够在Windows上使用cygwin做同样的事情。

答案 4 :(得分:2)

如果您在Ruby 1.9上,并假设yhager的命令有效,您可以尝试

File.open('/tmp/w1252', 'w') do |file|
  my_windows_1252_string.each_byte do |byte|
    file << byte
  end
end

`iconv -f windows-1252 -t utf-8 /tmp/w1252 > /tmp/utf8`

my_utf_8_string = File.read('/tmp/utf8')

['/tmp/w1252', '/tmp/utf8'].each do |path|
  FileUtils.rm path
end