这是在Ruby中unescape unicode转义序列的最佳方法吗?
我有一些文本包含Unicode转义序列,如\ u003C。 这就是我想出来的东西:
string.gsub(/\u(....)/) {|m| [$1].pack("H*").unpack("n*").pack("U*")}
这是对的吗? (即它似乎与我的测试一起工作,但有更多知识渊博的人能找到它的问题吗?)
你的正则表达式/\u(....)/
有一些问题。
首先, \u
不会按照你认为的方式工作,在1.9中你会得到一个错误,在1.8中它只会匹配一个u
而不是你正在寻找的\u
对; 你应该使用/\\u/
来找到你想要的字面\u
。
其次,你的(....)
组太过宽容,这将允许任何四个字符通过,这不是你想要的。 在1.9中,你想要(\h{4})
(四个hex数字)但在1.8中你需要([\da-fA-F]{4})
因为\h
是一个新东西。
因此,如果您希望正则表达式在1.8和1.9中都有效,则应使用/\\u([\da-fA-F]{4})/
。 这在1.8和1.9中给出了以下内容:
>> s = 'Where is \u03bc pancakes \u03BD house? And u1123!' => "Where is \\u03bc pancakes \\u03BD house? And u1123!" >> s.gsub(/\\u([\da-fA-F]{4})/) {|m| [$1].pack("H*").unpack("n*").pack("U*")} => "Where is μ pancakes ν house? And u1123!"
使用pack
和unpack
将hex数字转换为Unicode字符可能已经足够好了,但可能有更好的方法。