# File lib/addressable/uri.rb, line 305
    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)
        # We can't perform regexps on invalid UTF sequences, but
        # here we need to, so switch to ASCII.
        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