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

Replacing %uXXXX to the corresponding Unicode codepoint in Ruby

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

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

我明白了:

"rep\u00fcl\u0151"

而不是这个:

"repülő"

试试这个代码:

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

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

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

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

根据评论者@cremno 的想法,也可以尝试此代码:

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

例如:

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