json库将空格字符解释为“ \ xa0”

时间:2019-01-28 16:56:43

标签: python json python-3.x encoding character-encoding

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

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

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解析器。将标题结构解析为我自己的json-tree。我尝试将json文件转换为java中的Hashmap,效果很好,因此关于json文件本身似乎没有任何怪异之处。这是特定于python的问题,对此有任何解释吗?

1 个答案:

答案 0 :(得分:1)

假设:

  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

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