我的文件名包含%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ő"
答案 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ő"