9

のドキュメントurl_encodeを読みました。

を使用して、どの文字が何にエンコードされているかを正確に示す表はあります url_encodeか?

4

1 に答える 1

10

ERBurl_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 CGIescapeはまた、小さな正規表現を使用して、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
于 2012-11-12T05:39:19.753 に答える