这是在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!" 

使用packunpack将hex数字转换为Unicode字符可能已经足够好了,但可能有更好的方法。