URL 编码每个可能的字符
URL encode every possible character
我在 Ruby 中发出请求失败是很常见的,因为服务器不喜欢这种编码。一个常见的例子是当服务器只理解 %20
时将空格设置为 +
。今天我遇到了一个服务器,它不喜欢未编码的连字符 (-
),而是需要 %2D
。
我试过 CGI.escape
、URI.escape
、ERB::Util.url_encode
、WEBrick::HTTPUtils.escape
和 none 编码连字符。
过去我会根据需要使用 gsub
攻击角色,但随着我发现更多具有更多特质的服务器,我更喜欢更稳定的解决方案。
是否有一种标准的(即没有外部依赖性)方法,百分比编码所有可能的东西?
我不只是在寻找连字符编码或 gsub
一次一个地处理所有内容。
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()
字符。
我在 Ruby 中发出请求失败是很常见的,因为服务器不喜欢这种编码。一个常见的例子是当服务器只理解 %20
时将空格设置为 +
。今天我遇到了一个服务器,它不喜欢未编码的连字符 (-
),而是需要 %2D
。
我试过 CGI.escape
、URI.escape
、ERB::Util.url_encode
、WEBrick::HTTPUtils.escape
和 none 编码连字符。
过去我会根据需要使用 gsub
攻击角色,但随着我发现更多具有更多特质的服务器,我更喜欢更稳定的解决方案。
是否有一种标准的(即没有外部依赖性)方法,百分比编码所有可能的东西?
我不只是在寻找连字符编码或 gsub
一次一个地处理所有内容。
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()
字符。