添加反斜杠以修复ruby字符串中的字符编码

时间:2011-07-26 20:00:16

标签: ruby utf-8 character-encoding web-scraping utf-16

我确信这很容易,但我会被所有这些反斜杠打结。

我有一些数据,我正在从一个网站上(礼貌地)。偶尔会有一句话让我看起来像这样:

u00a362 000? you must be joking

当然应该是'£2 000?你一定是在开玩笑'。 irb的简短测试破译了它。

ruby-1.9.2-p180 :001 > string = "u00a3"
  => "u00a3" 
ruby-1.9.2-p180 :002 > string = "\u00a3"
  => "£" 

当然:添加一个反斜杠,它将被解码。我在this question的帮助下创建了以下内容:

puts str.gsub('u00', '\\u00') 

导致\u00a3输出。这一切都很好,但我希望它在字符串本身中是£。只是puts这还不够。

gsub('u00a3', '£')并不好,因为毫无疑问我会缺少其他角色。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

尝试使用Iconv库转换传入的字符串。您也可以看一下stringex gem。它有“走另一条路”的方法,但它可能提供你正在寻找的映射。也就是说,如果编码不好,就不可能做到正确。

答案 1 :(得分:0)

警告,以下情况并非如此。

str = "u00a362 000? you must be joking"
split_unicode = str.gsub(/(u00[a-z0-9]{2})/, "split_here\\1split_here").split(/split_here/)
final = split_unicode.map do |elem|
  if elem =~ /^u00/
    [("0x" + elem.gsub(/u00/, '')).hex].pack("U*")
  else
    elem
  end
end
puts final.join

所以这里的想法是找到u00xx值并将它们转换为十六进制。从那里,我们可以使用pack方法输出正确的unicode字符。

它也可能在一个可怕的单行中嘎嘎作响!

puts (str.gsub(/(u00[a-z0-9]{2})/, "split_here\\1split_here").split(/split_here/).map {|elem| elem =~ /^u00/ ? [("0x" + elem.gsub(/u00/, '')).hex].pack("U*") : elem}).join

可能有一个更好的解决方案(我希望!)但是这个有效。