拉丁美洲字符的Python编码

时间:2013-08-25 20:36:38

标签: python json encoding

我正在尝试允许用户注册我的服务,并且每当有人在他们的名字中注册拉丁美洲字符时我都会注意到错误。我尝试按以下方式阅读几个SO帖子/网站:

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/(android)

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

编辑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')

2 个答案:

答案 0 :(得分:3)

JSON应该几乎总是使用Unicode(编码时),如果你正在写一个网络服务器,那就是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应该会为您提供正确的结果。

因为你提到过“当有人注册时”:这意味着来自客户端(网络浏览器)的数据会传递给你。这些数据是如何发送的?你在写一个网络服务器的库/库是什么?

答案 1 :(得分:0)

事实证明,这主要是我从Android方面进行编码的问题。

我现在正在Android中设置StringEntity,现在它正在运行:

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库。