Ruby 关于 Ruby URL escape 场景 URI 与 CGI 的区别

huacnlee · 2016年01月12日 · 最后由 xworm 回复于 2016年01月13日 · 3875 次阅读

先看看这个例子,很多时候我们无法控制 UGC (用户产生的内容),可能会有各种奇葩的情况

Ruby 2.3.0

2.3.0 :010 > url = 'http://ruby-china.org/topics?a=%E6%B5%8B%E8%AF%95#测试'
 => "http://ruby-china.org/topics?a=%E6%B5%8B%E8%AF%95#测试" 
2.3.0 :011 > URI.unescape(url)
Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
    from /Users/jason/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/uri/rfc2396_parser.rb:332:in `gsub'
    from /Users/jason/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/uri/rfc2396_parser.rb:332:in `unescape'
    from /Users/jason/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/uri/common.rb:126:in `unescape'
    from (irb):11
    from /Users/jason/.rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>'
2.3.0 :012 > CGI.unescape(url)
 => "http://ruby-china.org/topics?a=测试#测试" 

我这个是在内部 GitLab 的时候发现的问题,结果查下来发现,Ruby 官方在 2009 年就把 URI.decode 给废弃了

  • lib/uri/common.rb (URI.escape): obsoleted.
  • lib/uri/common.rb (URI,unescape): ditto.

相关连接:

恍然大悟,之前遇到了这种坑

这个问题还没遇到过,但是我问过 URI 明明是处理 Url 的类,为什么连 query to hash 都没有,他们说,没有就是没有,你不服气就自己扩展 URI 类啊😂😂

需要 登录 后方可回复, 如果你还没有账号请 注册新账号