gpt4 book ai didi

ruby - Ruby 中的 url_encode

转载 作者:数据小太阳 更新时间:2023-10-29 06:49:52 29 4
gpt4 key购买 nike

我读了the documentation of url_encode .

是否有一张表格可以使用 url_encode 准确地告诉我哪个字符被编码成什么?

最佳答案

再培训局 url_encode可以调整:

def url_encode(s)
s.to_s.dup.force_encoding("ASCII-8BIT").gsub(%r[^a-zA-Z0-9_\-.]/) {
sprintf("%%%02X", $&.unpack("C")[0])
}
end

到:

def url_encode(s, regex=%r[^a-zA-Z0-9_\-.]/)
s.to_s.dup.force_encoding("ASCII-8BIT").gsub(regex) {
sprintf("%%%02X", $&.unpack("C")[0])
}
end

url_encode('pop', /./)
=> "%70%6F%70"

此外,Ruby 的 CGI 和 URI 模块能够对 URL 进行编码,将受限字符转换为实体,所以不要忽视它们的产品。

例如,URL 参数的转义字符:

CGI.escape('http://www.example.com')
=> "http%3A%2F%2Fwww.example.com"

CGI.escape('<body><p>foo</p></body>')
=> "%3Cbody%3E%3Cp%3Efoo%3C%2Fp%3E%3C%2Fbody%3E"

Ruby CGI 的 escape还使用一个小的正则表达式来确定应该在 URL 中转义哪些字符。这是文档中的方法定义:

def CGI::escape(string)
string.gsub(%r([^ a-zA-Z0-9_.-]+)/) do
'%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
end.tr(' ', '+')
end

您还可以覆盖它并更改正则表达式,或者在您重新定义方法的过程中公开它以供您自己使用:

def CGI::escape(string, escape_regex=%r([^ a-zA-Z0-9_.-]+)/)
string.gsub(escape_regex) do
'%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
end.tr(' ', '+')
end

URI.encode_www_form_component也做了类似的编码,字符的唯一区别是 *:

URI.encode_www_form_component('<p>foo</p>')
=> "%3Cp%3Efoo%3C%2Fp%3E"

而且,与覆盖 CGI::escape 类似,您可以覆盖 URI.encode_www_form_component 中的正则表达式:

def self.encode_www_form_component(str, regex=%r[^*\-.0-9A-Z_a-z]/)
str = str.to_s
if HTML5ASCIIINCOMPAT.include?(str.encoding)
str = str.encode(Encoding::UTF_8)
else
str = str.dup
end
str.force_encoding(Encoding::ASCII_8BIT)
str.gsub!(regex, TBLENCWWWCOMP_)
str.force_encoding(Encoding::US_ASCII)
end

关于ruby - Ruby 中的 url_encode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13338672/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com