我确信这很容易,但我会被所有这些反斜杠打结。
我有一些数据,我正在从一个网站上(礼貌地)。偶尔会有一句话让我看起来像这样:
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', '£')
并不好,因为毫无疑问我会缺少其他角色。
感谢您的帮助。
答案 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
可能有一个更好的解决方案(我希望!)但是这个有效。