Python 将 punycode 转换回 unicode

Python Convert punycode back to unicode

我正在尝试从一个偶尔将用户电子邮件存储在 punycode [=11= 中的数据库向 Sendgrid 添加联系人] 在 Unicode 中转换为 example-email@yahóo.com

无论如何,如果我尝试添加 ascii 版本,则会出现错误,因为 sendgrid 不接受它 - 但是它确实接受Unicode 版本。

那么有没有办法将它们转换成 python。

所以我认为长话短说有没有办法将 punycode 解码为 Unicode?

编辑

按照评论中的建议我试过了 'example-email@yahóo.com'.encode('punycode').decode() returns example-email@yaho.com-cgc 所以这在 python 之外是不正确的,所以不是有效的解决方案。

提前致谢。

在你编码的e-mail地址中有xn--ACE prefix

The ACE prefix for IDNA is "xn--" or any capitalization thereof.

因此应用 idna 编码(参见 Python Specific Encodings):

codec idna Implement RFC 3490, see also encodings.idna. Only errors='strict' is supported.

结果:

'yahóo.com'.encode('idna').decode()
# 'xn--yaho-sqa.com'

反之亦然:

'xn--yaho-sqa.com'.encode().decode('idna')
# 'yahóo.com'

您可以改用 idna library

Support for the Internationalised Domain Names in Applications (IDNA) protocol as specified in RFC 5891. This is the latest version of the protocol and is sometimes referred to as “IDNA 2008”.

This library also provides support for Unicode Technical Standard 46, Unicode IDNA Compatibility Processing.

This acts as a suitable replacement for the “encodings.idna” module that comes with the Python standard library, but which only supports the older superseded IDNA specification (RFC 3490).