添加反斜杠以修复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。 它有“走另一条路”的方法,但它可能提供你正在寻找的映射。 也就是说,如果编码不好,就不可能做到正确。