2010-12-22 109 views
0

如果URL中有一些unicode字符,並且在客戶端使用javascript(escape(text))轉義,那麼正確的方法是什麼?例如,如果我的網址是:domain.com/?text=%u05D0%u05D9%u05DA%20%u05DE%u05DE%u05D9%u05E8%u05D9%u05DD%20%u05D0%u05EA%20%u05D4%u05D8%u05E7% u05E1%u05D8%20%u05D4%u05D6%u05D4如何將unicode轉義序列URL轉換爲python unicode?

我想: 文本= urllib.unquote(request.GET.get( '文本')) ,但我得到了完全相同的字符串返回(%u05D0%u05D9 %u05DA%20%u05DE ...)

+2

可能的複製[Ho w在python中取消一個urlencoded unicode字符串?](http://stackoverflow.com/questions/300445/how-to-unquote-a-urlencoded-unicode-string-in-python)。簡短的回答:'%uXXXX`編碼方案是非標準的,你可能必須編寫你自己的解碼器。 – 2010-12-22 19:51:14

回答

3

最終我所做的是從逃生(文本),改變了客戶方urlEncodeComponent(文本) ,然後在使用Python端:

request.encoding = 'UTF-8' text = unicode(request.GET.get('text',None))

不知道這是做的最好的事情,但它在英語和希伯來語

+1

是的,`encodeURIComponent()`是URL編碼字符串的正確函數; `escape()`是一些怪異的自定義JavaScript特定編碼,看起來有點像URL編碼,但根本沒有。 – bobince 2010-12-22 20:18:25

0

工作,因爲你的%uxxxx不是Python標準,這是爲\ uXXXX,你需要一個棘手的變換來代替「%」以「\」,像下面的(在我的Python殼測試):

>>> import sys; reload(sys); sys.setdefaultencoding('utf8') 
<module 'sys' (built-in)> 
>>> text = '%u05D0%u05D9%u05DA%20%u05DE%u05DE%u05D9%u05E8%u05D9%u05DD%20%u05D0%u05EA%20%u05D4%u05D8%u05E7%u05E1%u05D8%20%u05D4%u05D6%u05D4' 
>>> text = text.replace('%', '\\') 
>>> text_u = text.decode('unicode-escape') 
>>> print text_u 
איךממיריםאתהטקסטהזה 

轉換成Unicode類型後,就可以把它轉換爲任何你喜歡的編碼,如下:

>>> text_utf8 = text_u.encode('utf8') 
>>> text_utf8 
'\xd7\x90\xd7\x99\xd7\x9a\x10\xd7\x9e\xd7\x9e\xd7\x99\xd7\xa8\xd7\x99\xd7\x9d\x10\xd7\x90\xd7\xaa\x10\xd7\x94\xd7\x98\xd7\xa7\xd7\xa1\xd7\x98\x10\xd7\x94\xd7\x96\xd7\x94' 
>>> print text_utf8 
איךממיריםאתהטקסטהזה