我有一些文本包含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)
使用pack
和unpack
将十六进制数字转换为Unicode字符可能已经足够好了,但可能有更好的方法.
归档时间: |
|
查看次数: |
3624 次 |
最近记录: |