Python:中文域名的编码处理

中文域名 通过 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

可以看到,处理结果是我们想要的

猜你喜欢

转载自blog.csdn.net/mouday/article/details/131345433