2013-08-25 102 views
0

我試圖讓用戶註冊我的服務,並且我注意到每當有人用他們的名字中的拉丁美洲字符註冊時出錯。我嘗試閱讀幾個SO帖子/網站,如下所示:Python編碼的拉丁美洲字符

Python regex against Latin-1 character encoding?

http://www.w3.org/TR/2009/WD-html5-20090423/infrastructure.html#character-encodings-0

http://docs.python.org/2/library/json.html

https://pypi.python.org/pypi/anyjson

但仍無法解決它。我的代碼示例是按如下:

>>> val = json.dumps({"name":"Déjà"}, encoding="ISO-8859-1") 
>>> val 
'{"name": "D\\u00c3\\u00a9j\\u00c3\\u00a0"}' 

反正是有強制編碼在這種情況下,對於和反序列化既要工作?任何幫助表示讚賞!

編輯

客戶端是Android和iPhone應用程序。我使用以下庫編碼客戶端上的JSON:

http://loopj.com/android-async-http/(機器人)

https://github.com/AFNetworking/AFNetworking(IOS)

EDIT 2 同樣的文字,從接收到的服務器Android客戶端按如下:

{"NAME":"D\ufffdj\ufffd"} 

我用anyjson反序列化,它說:

File "/usr/local/lib/python2.7/dist-packages/anyjson/__init__.py", line 135, in loads 
return implementation.loads(value) 

File "/usr/local/lib/python2.7/dist-packages/anyjson/__init__.py", line 99, in loads 
return self._decode(s) 

File "/usr/local/lib/python2.7/dist-packages/simplejson/__init__.py", line 454, in loads 
return _default_decoder.decode(s) 

File "/usr/local/lib/python2.7/dist-packages/simplejson/decoder.py", line 374, in decode 
obj, end = self.raw_decode(s) 

File "/usr/local/lib/python2.7/dist-packages/simplejson/decoder.py", line 393, in raw_decode 
return self.scan_once(s, idx=_w(s, idx).end()) 

ValueError: ('utf8', "D\xe9j\xe0", 1, 2, 'invalid continuation byte') 
+0

有關您的問題的更多信息將有所幫助。數據來自哪裏?你如何處理它? – Thanatos

+0

你能告訴我們一些應用程序發送/服務器正在接收的原始數據嗎? – icktoofay

回答

3

JSON應該幾乎總是使用Unicode(編碼時),如果您正在編寫Web服務器UTF-8。下面,在Python 3,基本上是正確的:

In [1]: import json 

In [2]: val = json.dumps({"name":"Déjà"}) 

In [3]: val 
Out[3]: '{"name": "D\\u00e9j\\u00e0"}' 

定睛一看:

'{"name": "D\\u00e9j\\u00e0"}' 
      ^^^^^^^ 
      The text \u00e9, which in JSON means "é". 
      The slash is doubled because we're looking at a repr of a str. 

你就可以發送VAL到客戶端,並在Javascript中,JSON.parse應該給你正確的結果。

因爲您提到「有人註冊時」:這意味着數據來自客戶端(網絡瀏覽器)。數據如何被髮送?你在編寫Web服務器的庫/庫是什麼?

+0

我更新了我的問題的細節。 – KVISH

0

原來,這主要是我從Android端進行編碼的一個問題。

我現在設置StringEntity這種方式在Android和它的工作現在:

StringEntity se = new StringEntity(obj.toString(), "UTF-8"); 
se.setContentType("application/json;charset=UTF-8"); 
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 

而且,我用anyjson其使用simplejson在服務器上。這也造成了錯誤。我轉而使用Python的json庫。