2011-01-08 39 views
2

我編碼字符串Python的simplejson庫有特殊字符:使用Python simplejson發送JSON在unicode編碼問題的另一個服務器的測試結果

hello testing

spécißl characters

plusses: +++++

special chars :œ∑´®†¥¨ˆøπ「ß∂ƒ©˙∆˚¬Ω≈ç√∫˜µ≤≥

然而,當我進行編碼,並將其傳送給另一機器(使用POST),結果如下:

{'message': ['{"body": "hello testing sp\\u00e9ci\\u00dfl characters\\n\\nplusses: \\n\\nspecial chars :\\u0153\\u2211\\u00b4\\u00ae\\u2020\\u00a5\\u00a8\\u02c6\\u00f8\\u03c0\\u201c\\u00df\\u2202\\u0192\\u00a9\\u02d9\\u2206\\u02da\\u00ac\\u03a9\\u2248\\u00e7\\u221a\\u222b\\u02dc\\u00b5\\u2264\\u2265"}']}

+符號被完全剝離,其餘的都是這種Unicode格式。我的代碼是:

data = {'body': data_string} 
data_encoded = json.dumps(data) 

任何想法?謝謝!

編輯:我試過使用json.dumps(data, ensure_ascii=False),但它導致UnicodeError ordinal not in range錯誤。

+0

問題出在哪裏?:) – virhilo 2011-01-08 23:07:36

+0

好吧,+ s丟失了,我試圖弄清楚如何將unicode字符表示轉換回正常狀態。和.encode('utf-8')似乎不起作用。 – Mark 2011-01-08 23:10:52

回答

0

你這樣做嗎?

>>> s = u""" 
... hello testing 
... 
... spécißl characters 
... 
... plusses: +++++ 
... 
... special chars :œ∑´®†¥¨ˆøπ「ß∂ƒ©˙∆˚¬Ω≈ç√∫˜µ≤≥ 
... """ 
>>> from json import dumps, loads 
>>> loads(dumps(s)) 
u'\nhello testing\n\nsp\xe9ci\xdfl characters\n\nplusses: +++++\n\nspecial chars :\u0153\u2211\xb4\xae\u2020\xa5\xa8\u02c6\xf8\u03c0\u201c\xdf\u2202\u0192\xa9\u02d9\u2206\u02da\xac\u03a9\u2248\xe7\u221a\u222b\u02dc\xb5\u2264\u2265\n' 
>>> print loads(dumps(s)) 

hello testing 

spécißl characters 

plusses: +++++ 

special chars :œ∑´®†¥¨ˆøπ「ß∂ƒ©˙∆˚¬Ω≈ç√∫˜µ≤≥ 

>>> 
2
>>> import json 

簡單的例子,有加分,Latin1的 「鋒利」,西裏爾字母 「資本哲」

注:確保您的字符串是Unicode或ASCII:

>>> data = {"body" : u"++\xdf\u0416", "universe": 42} 
>>> data 
{'body': u'++\xdf\u0416', 'universe': 42} 

創建你的JSON字符串,其結果是ASCII - 所有非ASCII字符都會被轉義:

>>> encoded = json.dumps(data) 
>>> encoded 
'{"body": "++\\u00df\\u0416", "universe": 42}' 

將您的JSON字符串傳輸到另一臺計算機。 如果您的傳輸通道損壞了ASCII字符,請務必進行必要的轉義。在遠程計算機上,執行任何必要的操作以恢復JSON字符串。

然後JSON字符串轉換回Python對象:

>>> decoded = json.loads(encoded) 
>>> decoded 
{u'body': u'++\xdf\u0416', u'universe': 42} 
>>> decoded == data 
True 
>>> 

ensure_ascii=False的說明:這將產生一個unicode字符串:

>>> u_encoded = json.dumps(data, ensure_ascii=False) 
>>> u_encoded 
u'{"body": "++\xdf\u0416", "universe": 42}' 

必須編碼(UTF-8建議)轉換爲str字符串,然後才能傳輸它,並在另一端進行解碼。你仍然需要採取預防措施,以防止損壞+ < > &等字符。