def self.encode_component(component, character_class=
CharacterClasses::RESERVED + CharacterClasses::UNRESERVED)
return nil if component.nil?
if !component.respond_to?(:to_str)
raise TypeError, "Can't convert #{component.class} into String."
end
component = component.to_str
if ![String, Regexp].include?(character_class.class)
raise TypeError,
"Expected String or Regexp, got #{character_class.inspect}"
end
if character_class.kind_of?(String)
character_class = /[^#{character_class}]/
end
if component.respond_to?(:force_encoding)
component = component.dup
component.force_encoding(Encoding::ASCII_8BIT)
end
return component.gsub(character_class) do |sequence|
(sequence.unpack('C*').map { |c| "%" + ("%02x" % c).upcase }).join("")
end
end