Python Django 中的捷克语 unicode 问题

Czech unicode issue in Python Django

我有这个 URL https://českébudějovice.mysite.com/,它是一个捷克城市名称。当有人访问 url 时,我提取子域并查询 City 模型对象。所以我在 Django 中有城市模型,可以通过 shell:

成功查询该城市
>> City.objects.get(name='českébudějovice')
>> <City: České Budějovice, Czech Republic>

但是今天我在 Sentry 生产环境中收到一个异常,说 'City matching query does not exist' 并且 URL 显示如下:

xn--eskbudjovice-deb41c5g.mysite.com

显然,我没有名称为 'xn--eskbudjovice-deb41c5g' 的城市,因此出现 'City matching query does not exist' 错误。

我一直在尝试将那个奇怪的子域转换为实际名称,但没有成功。我试过以下:

>> s='xn--eskbudjovice-deb41c5g'
>> print s.encode('utf8')
>> xn--eskbudjovice-deb41c5g

我正在使用 Cloudflare,我想知道它是否以某种方式将 url 转换为那种形式,而不是将其作为 unicode 提供给我的服务器。

这称为 Punycode,它是表示国际域名的有效方式。

您可以使用 'idna' 编解码器解码字符串:

>>> s = 'xn--eskbudjovice-deb41c5g'
>>> print(s.decode('idna'))
českébudějovice

如果您使用 Python 3,请使用 codecs 解码 punycode。

$ python
Python 2.7.9 (default, Aug 13 2016, 16:41:35) 

>>> 'xn--eskbudjovice-deb41c5g'.decode('idna')
u'\u010desk\xe9bud\u011bjovice'

>>> print 'xn--eskbudjovice-deb41c5g'.decode('idna')
českébudějovice