首页 > 解决方案 > json 库将空格字符解释为 "\xa0"

问题描述

当我将 json 文件加载到 python 中时,只要将文件视为字符串,编码就没有问题。但是,使用文件上的 json.load 或字符串上的 json.loads 将文件加载为 json 格式,所有空格字符都会显示为“\xa0”

以下代码产生正常结果,打印没有任何时髦的“\xa0”符号的 json 字符串。

with open(json_path) as f:
    lines = f.readlines()
    for line in lines:
        print(line)

将文件加载为 json 格式,突然间空格字符被解释为“\xa0”。

with open(json_path) as f:
    data = json.load(f)
    print(data.keys())

给出以下内容:

dict_keys(['1.\xa0\lorem\xa0ipsum', '2.\xa0\lorem\xa0ipsum\xa0\lorem\xa0ipsum', '3.\xa0\lorem', '4.\xa0\lorem\xa0ipsum' , '5.\xa0\lorem\xa0ipsum'])

使用 json.loads 加载字符串而不是文件会得到相同的结果:

with open(json_path) as f:
    lines = f.read()

data = json.loads(s)
print(data.keys())

我正在使用 java 和 pdf-box 构建一个 pdf-parser。将标题结构解析为我自己的 json-tree。我尝试将 json 文件转换为 java 中的 Hashmap,效果很好,因此 json 文件本身似乎没有任何奇怪之处。这是一个特定于python的问题吗?有什么解释吗?

标签: pythonjsonpython-3.xencodingcharacter-encoding

解决方案


假如说:

  1. 您的 JSON 文件有效并使用 UTF-8 作为编码。
  2. 您的 JSON 文件包含带有不间断空格的键。

那么你得到的输出是完全正确的。

第一段代码读取并打印字符串:

with open(json_path) as f:
    lines = f.readlines()
    for line in lines:
        print(line)

当您打印一个字符串时,它的输出或多或少没有变化,并且不间断空格看起来与常规空格相同。

第二段代码解析一个 JSON 文件,从而创建一个字典,然后打印字典键。为了解释的简单,让我们假设字典本身被打印(而不是键):

with open(json_path) as f:
    data = json.load(f)
    print(data)

使用字典作为参数调用print__str__调用字典的函数。该__str__函数使用它自己的规则来格式化输出,例如,它将字典括在大括号中,添加单引号等。

如果您研究输出,您可能会发现打印字典会为字典创建有效的 Python 代码

在 Python 字符串中,某些字符需要转义。转义序列以反斜杠开头。一个典型的例子是换行符:

d = {'line1\nline2': 3}
print(d)

输出:

{'line1\nline2': 3}

字典逻辑的一部分__str__显然也是要转义不间断空格,因为否则它们无法在视觉上与常规空格区分开来(即使这不是绝对必要的)。在 Python 中转义它的正确方法是\a0.

所以一切都按设计工作。这是一个功能,而不是一个错误。


推荐阅读