2017-09-03 153 views
0

我有這個URL https://českébudějovice.mysite.com/,這是捷克城市的名字。當有人訪問該網址時,我提取子域並查詢城市模型對象。所以,我有Django的城市模型,並可以成功查詢該城市通外殼:Python Django中的捷克unicode問題

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

但是今天我在生產收到了異常的哨兵說,「城市匹配查詢不存在」,網址是這個樣子:

xn--eskbudjovice-deb41c5g.mysite.com 

很顯然,我沒有一個城市名稱爲「XN - eskbudjovice-deb41c5g」因此,我發現了「城市匹配查詢不存在」的錯誤。

我一直在試圖將那個奇怪的子域名轉換成實際的名字,但沒有運氣。我已經試過如下:

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

我使用CloudFlare的,我不知道它是否以某種方式轉換網址這種形式,而不是爲它服務爲Unicode到我的服務器。

+1

域名中的編碼不是utf8。請參閱https://en.wikipedia.org/wiki/Internationalized_domain_name。 – pvg

回答

3

這就是所謂的Punycode,它是表示國際域名的有效方式。

可以解碼使用 'IDNA' 編解碼器的字符串:

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

如果你在Python 3中,使用codecs解碼Punycode的形式顯示。

+1

spasibo bratan :) – if237912print

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 
+0

不知道爲什麼downvotes,好的答案以及 – if237912print