code: def iri_to_uri(iri, charset='utf-8'):
      r
      iri = unicode(iri)
      scheme, auth, hostname, port, path, query, fragment = _uri_split(iri)
  
      scheme = scheme.encode('ascii')
      hostname = hostname.encode('idna')
  
      if ':' in hostname:
          hostname = '[' + hostname + ']'
  
      if auth:
          if ':' in auth:
              auth, password = auth.split(':', 1)
          else:
              password = None
          auth = _quote(auth.encode(charset))
          if password:
              auth += ':' + _quote(password.encode(charset))
          hostname = auth + '@' + hostname
      if port:
          hostname += ':' + port
  
      path = _quote(path.encode(charset), safe="/:~+%")
      query = _quote(query.encode(charset), safe="=%&[]:;$()+,!?*/")
  
      # this absolutely always must return a string.  Otherwise some parts of
      # the system might perform double quoting (#61)
      return str(urlparse.urlunsplit([scheme, hostname, path, query, fragment]))
docs: r"""Converts any unicode based IRI to an acceptable ASCII URI.  Werkzeug
      always uses utf-8 URLs internally because this is what browsers and HTTP
      do as well.  In some places where it accepts an URL it also accepts a
      unicode IRI and converts it into a URI.
  
      Examples for IRI versus URI:
  
      >>> iri_to_uri(u'http://☃.net/')
      'http://xn--n3h.net/'
      >>> iri_to_uri(u'http://üser:pässword@☃.net/påth')
      'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th'
  
      .. versionadded:: 0.6
  
      :param iri: the iri to convert
      :param charset: the charset for the URI