Python Django中的捷克unicode问题

时间:2017-09-03 23:28:41

标签: python unicode cloudflare

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

>> City.objects.get(name='českébudějovice')
>> <City: České Budějovice, Czech Republic>

然而今天我收到Sentry关于制作的例外情况,说“城市匹配查询不存在”,URL显示如下:

xn--eskbudjovice-deb41c5g.mysite.com

显然,我没有一个名为'xn - eskbudjovice-deb41c5g'的城市,因此我得到'城市匹配查询不存在'错误。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

$ 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