【问题标题】:Encoding - Problems creating JSON using an Unicode Object in Python编码 - 在 Python 中使用 Unicode 对象创建 JSON 时出现问题
【发布时间】:2015-10-19 12:04:41
【问题描述】:

我在将字符串编码/解码为特定字符集 (UTF-8) 时遇到了一些实际问题。

我的 Unicode 对象是:

>> u'Valor Econ\xf4mico - Opini\xe3o'

当我从 python 调用 print 时,它返回:

>> Valor Econômico - Opinião

当我从我的 unicode 对象调用 .encode("utf-8") 以将其写入 JSON 时,它会返回:

>> 'Valor Econ\xc3\xb4mico - Opini\xc3\xa3o'

我做错了什么? print() 到底在做什么而我却没有?

Obs:我正在从文件的一行创建这个 unicode 对象。

import codecs
with codecs.open(path, 'r') as local_file:
    for line in local_file:
        obj = unicode((line.replace(codecs.BOM_UTF8, '')).replace('\n', ''), 'utf-8')

【问题讨论】:

  • 为什么需要编码才能写入json?
  • json模块已经自动支持unicode
  • 使用标准的 json 模块,调用 json.dumps(your_string) 就可以了。将解码此 JSON 的应用程序是否兼容 UTF-8?
  • 这只是repr 的输出,当你print 'Valor Econ\xc3\xb4mico - Opini\xc3\xa3o'.encode("utf-8") 时,它将是Valor Econômico - Opinião
  • 一般情况下,当通过 Internet 发送 JSON 时,它会被转换为带有 unicode 字符的 ascii 字符,并使用 \uXXXX 进行转义以实现兼容性。转储json.dumps(text,ensure_ascii=False) 中有一个选项,但这可能不是您想要在这里做的。为什么文件中的文本需要是JSON?

标签: python utf-8 python-unicode


【解决方案1】:

Valor Econ\xc3\xb4mico - Opini\xc3\xa3o 是为非 UTF-8 终端准备的 UTF-8 表示,可能在交互式 shell 中。如果您要将其写入文件 (open("myfile", "wb").write("Valor Econ\xc3\xb4mico - Opini\xc3\xa3o"),那么您将拥有一个有效的 UTF-8 文件。

要从文件创建 Unicode 字符串,您可以在 io 模块中使用自动解码(Codecs.open() 已被弃用)。 BOM 将被自动删除:

import io
with io.open(path, "r", encoding="utf-8") as local_file:
    for line in local_file:
        unicode_obj = line.strip()

在创建 JSON 响应时,请使用来自 json.dumps(my_object) 的结果。它将返回一个 str,其中包含使用 Unicode 代码点编码的所有非 ASCII 字符。

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多