中文域名 通过 https://whois.aliyun.com/domain/百度.中国 域名信息查询(WHOIS)结果如下
Domain Name: 百度.中国
Puny Name: xn--wxtr44c.xn--fiqs8s
中文域名处理
print('中国'.encode('punycode'))
# b'fiqs8s'
print('百度.中国'.encode('punycode'))
# b'.-lq6ay5zb9h854a'
print('百度.中国'.encode('idna'))
# b'xn--wxtr44c.xn--fiqs8s'
英文域名处理
print('www.baidu.com'.encode('idna'))
# b'www.baidu.com'
print('www.baidu.com'.encode('punycode'))
# b'www.baidu.com-'
查看Python ssl模块的源码
class SSLContext(_SSLContext):
def _encode_hostname(self, hostname):
if hostname is None:
return None
elif isinstance(hostname, str):
return hostname.encode('idna').decode('ascii')
else:
return hostname.decode('ascii')
里边有一个_encode_hostname 函数,处理域名编码
def encode_hostname(hostname):
if hostname is None:
return None
elif isinstance(hostname, str):
return hostname.encode('idna').decode('ascii')
else:
return hostname.decode('ascii')
if __name__ == '__main__':
print(encode_hostname('www.baidu.com'))
# www.baidu.com
print(encode_hostname('baidu.中国'))
# baidu.xn--fiqs8s
print(encode_hostname('百度.中国'))
# xn--wxtr44c.xn--fiqs8s
可以看到,处理结果是我们想要的