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

Eri*_*son 8 ruby unicode

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

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

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

mu *_*ort 17

你的正则表达式/\u(....)/有一些问题.

首先,\u它不会像你想象的那样工作,在1.9中你会得到一个错误,在1.8中它只匹配一个u而不是\u你正在寻找的那个; 你应该/\\u/用来找到\u你想要的文字.

其次,你的(....)团队太宽容了,这将允许任何四个角色通过,这不是你想要的.在1.9,你要(\h{4})(四个十六进制数字),但在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!"
Run Code Online (Sandbox Code Playgroud)

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