Python 将 punycode 转换回 unicode

loc*_*ose 6 python unicode punycode sendgrid

我正在尝试从数据库将联系人添加到Sendgrid ,该数据库偶尔会将用户电子邮件存储在punycode example-email@xn--yaho-sqa.com中,该代码会转换example-email@yah\xc3\xb3o.com为 Unicode。

\n

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

\n

那么有没有办法在Python中将它们转换。

\n

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

\n

编辑

\n

正如评论中所建议的,我尝试\n'example-email@yah\xc3\xb3o.com'.encode('punycode').decode()返回example-email@yaho.com-cgc,所以这在Python之外是不正确的,所以不是一个有效的解决方案。

\n

提前致谢。

\n

Jos*_*efZ 9

您的编码电子邮件地址中有xn-- ACE 前缀:

\n
\n

IDNA 的 ACE 前缀是“xn--”或其任何大写字母。

\n
\n

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

\n
\n

编解码器idna实现RFC 3490,另请参阅encodings.idna。\n仅支持Errors=\'strict\'。

\n
\n

结果:

\n
\'yah\xc3\xb3o.com\'.encode(\'idna\').decode()\n# \'xn--yaho-sqa.com\'\n
Run Code Online (Sandbox Code Playgroud)\n

反之亦然:

\n
\'xn--yaho-sqa.com\'.encode().decode(\'idna\')\n# \'yah\xc3\xb3o.com\'\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用该idna库来代替:

\n
\n

支持应用程序中的国际化域名 (IDNA)\n协议,如RFC 5891中指定。这是协议的最新版本,有时称为 \xe2\x80\x9cIDNA 2008\xe2\x80\x9d。

\n

该库还提供对 Unicode 技术标准 46、\n Unicode IDNA 兼容性处理的支持。

\n

这可以作为encodings.idnaPython 标准库附带的 \xe2\x80\x9c \xe2\x80\x9d 模块的合适替代品,但仅支持较旧的被取代的 IDNA 规范 ( RFC 3490 )。

\n
\n