中文域名 通过 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
-
可以看到,处理结果是我们想要的