我想知道如何在Python中獲得像سلام
這樣的阿拉伯字符串的Unicode表示形式?如何獲取Django中的阿拉伯字符串的Unicode表示形式?
結果應該是\u0633\u0644\u0627\u0645
我需要的,這樣我可以比較來自MySQL數據庫和存儲在Redis的緩存中的數據檢索的文本。
我想知道如何在Python中獲得像سلام
這樣的阿拉伯字符串的Unicode表示形式?如何獲取Django中的阿拉伯字符串的Unicode表示形式?
結果應該是\u0633\u0644\u0627\u0645
我需要的,這樣我可以比較來自MySQL數據庫和存儲在Redis的緩存中的數據檢索的文本。
假設你有一個實際的Unicode字符串,你可以做
# -*- coding: utf-8 -*-
s = u'سلام'
print s.encode('unicode-escape')
輸出
\u0633\u0644\u0627\u0645
的# -*- coding: utf-8 -*-
指令純粹是爲了告訴解釋器的源代碼是UTF-8編碼,但對腳本本身是如何處理Unicode無關。
如果你的腳本讀取從UTF-8編碼的來源,阿拉伯語字符串,該字節將是這樣的:
\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85
您可以在轉換爲Unicode是這樣的:
data = '\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'
s = data.decode('utf8')
print s
print s.encode('unicode-escape')
輸出
سلام
\u0633\u0644\u0627\u0645
當然,您確實需要確保您的終端設置爲正確處理Unicode。
注意
'\u0633\u0644\u0627\u0645'
是含有24個字節的純(字節)字符串,而
u'\u0633\u0644\u0627\u0645'
是含有4個Unicode字符的Unicode字符串。
您可能會發現這篇文章有幫助:Pragmatic Unicode,這是由SO老將Ned Batchelder寫的。
在python 2.x中使用u
預先填充字符串,這會使您的字符串成爲unicode字符串。然後你可以調用一個unicode字符串的encode
方法。
arabic_string = u'سلام'
arabic_string.encode('utf-8')
輸出:
print arabic_string.encode('utf-8')
'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'
這yeilds一個錯誤:'「ASCII」編解碼器不能編碼字符在0-3位置:有序不在範圍內(128)' – supermario
哪個Python版本您使用的? – JClarke
我正在使用Python 2.7.6 – supermario
對於Python 2.7
string = 'سلام'
new_string = unicode(string)
當我在終端打印'string'時,它仍然是'سلام'。此外,比較不按預期進行。 – supermario
對不起,只是分配它 – Navidad20
由於您使用的是Python 2.x,因此無法使用encode
。您需要使用unicode
函數將字符串轉換爲unicode對象。
> f='سلام'
> f
'\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85'
> unicode(f, 'utf-8') # note: you need to pass the encoding parameter in or you'll
# keep having the same problem.
u'\u0633\u0644\u0627\u0645'
> print unicode(f, 'utf-8')
سلام
我不知道您使用的是獲取內容是什麼庫,但你也許可以將數據爲Unicode最初取。
> f = u'سلام'
> f
u'\u0633\u0644\u0627\u0645'
> print f.encode('unicode-escape')
\u0633\u0644\u0627\u0645
> print f
سلام
好,雖然這在終端工作,我需要分配輸出到一個新的變量。它不能在我的views.py中使用'print'來完成。任何想法來解決這個問題? – supermario
@supermario像這樣的東西應該工作:'a = s.encode('unicode-escape')' –