严格来说URI不能包含非ASCII字符;您所拥有的是一个IRI。
要将IRI转换为纯ASCII URI,请执行以下操作:
地址的主机名部分中的非ASCII字符必须使用基于Punypre的IDNA算法进行编码;
根据Ignacio的回答,路径中的非ASCII字符以及地址的大多数其他部分必须使用UTF-8和%-encoding进行编码。
所以:
import re, urlparsedef urlEnpreNonAscii(b): return re.sub('[x80-xFF]', lambda c: '%%%02x' % ord(c.group(0)), b)def iriToUri(iri): parts= urlparse.urlparse(iri) return urlparse.urlunparse( part.enpre('idna') if parti==1 else urlEnpreNonAscii(part.enpre('utf-8')) for parti, part in enumerate(parts) )>>> iriToUri(u'http://www.au0131b.com/au0131b')'http://www.xn--ab-hpa.com/a%c4%b1b'(从技术上讲,这在一般情况下还是不够好,因为
urlparse它不会在主机名上拆分任何
user:pass@前缀或
:port后缀。仅主机名部分应经过IDNA编码。使用常规代码
urllib.quote和
.enpre('idna')在您使用时更容易编码构造一个URL,而不必将IRI分开。)


