[英]adding backslash to fix character encoding in ruby string
我敢肯定这很容易,但是我正与所有这些反斜杠纠结在一起。
我有一些要从网站(礼貌地)抓取的数据。 有时候我会看到一个句子,看起来像这样:
u00a362 000? you must be joking
哪个当然应该是'2000英镑? 你一定是在开玩笑'。 irb的简短测试将其解密。
ruby-1.9.2-p180 :001 > string = "u00a3"
=> "u00a3"
ruby-1.9.2-p180 :002 > string = "\u00a3"
=> "£"
当然:添加一个反斜杠,它将被解码。 我借助此问题创建了以下内容:
puts str.gsub('u00', '\\u00')
这导致输出\£
。 这一切都很好,但是我希望它在字符串本身中是£。 仅仅puts
这还不够。
做gsub('u00a3', '£')
因为毫无疑问我会缺少其他字符。
谢谢你的帮助。
尝试使用Iconv库转换传入的字符串。 您也可以看看stringex gem。 它具有“另辟go径”的方法,但可以提供您要查找的映射。 就是说,如果编码不好,就不可能正确。
警告,以下内容不是很漂亮。
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
也许有更好的解决方案(我希望!),但是这个可行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.