Python JSON和Unicode

int*_*tar 6 python unicode json

更新:

我在这里找到了答案:Python UnicodeDecodeError - 我误解了编码吗?

当我读取它时,我需要将传入的文件显式解码 Unicode.因为它的字符既不可接受也不是unicode.所以编码在遇到这些字符时失败了.

原始问题

所以,我知道有些东西我不会来这里.

我有一个unicode字符串数组,其中一些包含非Ascii字符.

我想将其编码为json

json.dumps(myList)
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误

UnicodeDecodeError: 'ascii' codec can't decode byte 0xb4 in position 13: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我该怎么做?我已经尝试将ensure_ascii参数设置为True和False,但都没有修复此问题.

我知道我将unicode字符串传递给json.dumps.我知道json字符串是unicode.为什么不只是为我排序呢?

我究竟做错了什么?

更新:Don Question明智地建议我提供堆栈跟踪.这里是.:

Traceback (most recent call last):
  File "importFiles.py", line 69, in <module>
    x = u"%s" % conv
  File "importFiles.py", line 62, in __str__
    return self.page.__str__()
  File "importFiles.py", line 37, in __str__
    return json.dumps(self.page(),ensure_ascii=False)
  File "/usr/lib/python2.7/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 204, in encode
    return ''.join(chunks)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb4 in position 17: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

注意它是python 2.7,并且在ensure_ascii = False时仍然会发生错误

更新2:Andrew Walker的有用链接(在评论中)让我认为我可以在尝试json之前将我的数据强制转换为方便的字节格式.通过执行以下操作来对其进行编码:

data.encode("ascii","ignore")
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会引发同样的错误.

Don*_*ion 7

尝试添加参数:ensure_ascii = False.特别是在询问与unicode相关的问题时,添加更长(完整)的回溯并说明您正在使用哪个python版本非常有用.

引用python-documentation:版本2.6.7:

"如果ensure_ascii为False(默认值为True),那么写入fp的一些块可能是unicode实例,受普通Python str的unicode强制规则限制.除非fp.write()明确理解unicode(如codecs.getwriter())这可能会导致错误."

所以这个提议可能会引起新的问题,但它解决了我遇到的类似问题.我将生成的unicode-String输入StringIO对象并将其写入文件.

因为python 2.7和sys.getdefaultencoding设置为ascii通过''.join(chunks)json-standard-library 的语句进行隐式转换,如果chunks不是ascii编码就会爆炸!您必须确保任何包含的字符串在之前转换为ascii兼容表示!您可以尝试utf-8编码的字符串,但如果我没有弄错,unicode字符串将无法工作.