首页 > 解决方案 > URL 编码每个可能的字符

问题描述

我在 Ruby 中发出请求失败的情况很常见,因为服务器不喜欢编码。一个常见的例子是+当服务器只理解时有空格%20。今天我遇到了一个不喜欢未编码连字符(-)的服务器,%2D而是要求。

我已经尝试过CGI.escape, URI.escape, ERB::Util.url_encode, WEBrick::HTTPUtils.escape, 并且没有人对连字符进行编码。

在过去,我gsub根据需要求助于冒犯的角色,但随着我发现更多具有更多特质的服务器,我更喜欢更稳定的解决方案。

是否有一种标准(即没有外部依赖项)方法可以对所有可能的内容进行百分比编码?

我不是在寻找连字符编码或gsub一次寻找所有内容。

标签: rubyurlencode

解决方案


URI.escape已被弃用,取而代之的CGI::escape是通过抓取非字母数字字符并转换它们符合 RFC。这是执行此操作的模块:

# https://ruby-doc.org/stdlib-2.4.3/libdoc/cgi/rdoc/CGI/Util.html

# File cgi/util.rb, line 11
def escape(string)
  encoding = string.encoding
  string.b.gsub(/([^ a-zA-Z0-9_.-]+)/) do |m|
    '%' + m.unpack('H2' * m.bytesize).join('%').upcase
  end.tr(' ', '+').force_encoding(encoding)
end      

归根结底,需要修复的是服务器,而不是您的代码。您可以monkeypatch 或fork CGI 并-从正则表达式或gsub()字符中删除。


推荐阅读