这是在Ruby中unescape unicode转义序列的最佳方法吗?

时间:2011-08-10 18:21:33

标签: ruby unicode

我有一些包含Unicode转义序列的文本,例如\ u003C。这就是我想出来的东西:

string.gsub(/\u(....)/) {|m| [$1].pack("H*").unpack("n*").pack("U*")}

这是对的吗? (即它似乎与我的测试一起工作,但更有知识的人可以找到它的问题吗?)

1 个答案:

答案 0 :(得分:17)

您的正则表达式/\u(....)/存在一些问题。

首先,\u不能按您认为的方式工作,在1.9中您会收到错误,而在1.8中它只匹配单个u而不是{{} 1}}你正在寻找的对;您应该使用\u来查找所需的文字/\\u/

其次,你的\u群体过于宽松,这将允许任何四个角色通过,这不是你想要的。在1.9中,您需要(....)(四个十六进制数字),但在1.8中您需要(\h{4}),因为([\da-fA-F]{4})是新事物。

因此,如果您希望正则表达式在1.8和1.9中都有效,则应使用\h。这在1.8和1.9中给出了以下内容:

/\\u([\da-fA-F]{4})/

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