def self.normalize_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
unencoded = self.unencode_component(component)
begin
encoded = self.encode_component(
Addressable::IDNA.unicode_normalize_kc(unencoded),
character_class
)
rescue ArgumentError
encoded = self.encode_component(unencoded)
end
return encoded
end