Python Djang中的捷克Unicode问题

2024-09-30 14:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个网址https://českébudějovice.mysite.com/,是捷克城市的名字。当有人访问这个url时,我提取子域并查询City model对象。因此,我在Django有城市模型,可以通过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提供给我的服务器。你知道吗


Tags: 子域httpscomurlcitymodel名字网址
2条回答

这称为Punycode,是表示国际域名的有效方法。你知道吗

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

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

如果您使用的是python3,请使用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

相关问题 更多 >