将 %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ő"
我有包含 %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ő"