【问题标题】:Python encoding of Latin american characters拉丁美洲字符的Python编码
【发布时间】:2013-08-28 07:29:17
【问题描述】:

我正在尝试允许用户注册我的服务,每当有人在其名称中使用拉丁美洲字符注册时,我都会注意到错误。我尝试阅读以下几个 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/(安卓)

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

【问题讨论】:

  • 有关您的问题的更多信息会有所帮助。数据从何而来?你是怎么处理的?
  • 您能否向我们展示一些应用程序正在发送/服务器正在接收的原始数据?

标签: python json encoding


【解决方案1】:

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 应该会给您正确的结果。

因为您提到“当有人注册时”:这意味着数据来自客户端(网络浏览器)给您。这些数据是如何发送的?您在哪些库/库中编写网络服务器?

【讨论】:

    【解决方案2】:

    事实证明,这主要是我在 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"));
    

    另外,我在使用simplejson 的服务器上使用anyjson。这有时也会产生错误。我转而使用 Python 的 json 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      相关资源
      最近更新 更多