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

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

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

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" => "£" 

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

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

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

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

谢谢你的帮助。

警告,以下不是很漂亮。

 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值并将它们转换为hex。 从那里,我们可以使用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 

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

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