2013-08-25 61 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库。