将%uXXXX替换为Ruby中相应的Unicode代码点

时间:2015-02-27 20:06:59

标签: ruby regex unicode escaping gsub

我的文件名包含%uXXXX子字符串,其中XXXX是十六进制数字/数字,例如%u0151等。我通过应用URI.unescape获得了这些文件名,这可以将%XX子字符串替换为相应的字符但是%uXXXX子串保持不变。我想用应用String#gsub的相应Unicode代码点替换它们。我尝试了以下方法,但没有成功:

"rep%u00fcl%u0151".gsub(/%u([0-9a-fA-F]{4,4})/,'\u\1')

我明白了:

"rep\\u00fcl\\u0151"

而不是:

"repülő"

2 个答案:

答案 0 :(得分:2)

试试这段代码:

string.gsub(/%u([0-9A-F]{4})/i){[$1.hex].pack("U")}

在评论中,cremno有更快的解决方案:

string.gsub(/%u([0-9A-F]{4})/i){$1.hex.chr(Encoding::UTF_8)}

在评论中,bobince增加了重要的限制,值得一读。

答案 1 :(得分:1)

Per commenter @ cremno的想法,请尝试以下代码:

gsub(/%u([0-9A-F]{4})/i) { $1.hex.chr(Encoding::UTF_8) }

例如:

s = "rep%u00fcl%u0151"
s.gsub(/%u([0-9A-F]{4})/i) { $1.hex.chr(Encoding::UTF_8) }
# => "repülő"