CGI.unescape和URI.decode_www_form_component有什么区别?

时间:2015-06-11 14:36:16

标签: ruby encoding

这些功能似乎做同样的事情。

irb> CGI.unescape "Sloths%3A+Society+and+Habitat"
=> "Sloths: Society and Habitat"

irb> URI.decode_www_form_component "Sloths%3A+Society+and+Habitat"
=> "Sloths: Society and Habitat"

有什么区别?

1 个答案:

答案 0 :(得分:4)

这些方法非常类似。它们都接受字符串和编码,并以指定的编码返回一个字符串,并解码%个转义符。但存在差异:

无效的转义

如果字符串包含无效的转义序列,

URI.decode_www_form_component会引发ArgumentError

URI.decode_www_form_component('%xz')
# ArgumentError: invalid %-encoding (%xz)

CGI.unescape只是忽略了它们。

CGI.unescape('%xz')
# "%xz"

编码无效

如果结果无效,

CGI.unescape会忽略您指定的编码

p CGI.unescape("\u263a", 'ASCII')
# "☺"

URI.decode_www_form_component无关紧要

p URI.decode_www_form_component("\u263a", 'ASCII')
# "\xE2\x98\xBA"

最后(我甚至不提这个),URI.decode_www_form_component 稍微更快,因为它使用预先计算的哈希来解码所有485个有效转义码(它区分大小写),而CGI.unescape实际上解释了十六进制代码并将其重新打包为一个字符。