python3 如何解码字符串中的 Unicode 编码,其他字符转不受影响

jsonstr = '{"datePublished": "2019-11-13", "genre": ["\u771f\u4eba\u79c0"], "duration": "PT1H0M", "description": "GOT7正在举行世界巡演\"GOT7 2019 WORLD TOUR KEEP SPINNING\"暂时回国录制的真人秀节目,拍摄前与制作组见面,回忆了他们在「GOT7的HARD CARRY 2.5」..."}'

如果这个字符串 直接使用json.loads(jsonstr) 转为json 的话,会报一个错误 json.decoder.JSONDecodeError: Invalid \escape:

因为jsonstr包含了 Unicode 编码的字符串 同时还包含 正常的中文字符,要是直接用 jsonstr.encode('gbk').decode('unicode_escape') ,虽然里面的Unicode字符串成功转换为了中文,但是原本是正常正文的字符串变成乱码。那么问题是: 如何仅转换里面的 Unicode 字符,而非 Unicode字符不转换呢??

阅读 4.1k
2 个回答

你这个出错的原因并不是编码问题,而是 \&#34 这种解析不了,这是 Python 字符串实现上的问题。所以,你可以尝试把这个给替换成其他字符,只需要把这段替换掉再转换就好了,例如只替换里面的 \

>>> import json
>>> jsonstr = '{"datePublished": "2019-11-13", "genre": ["\u771f\u4eba\u79c0"], "duration": "PT1H0M", "description": "GOT7正在举行世界巡演\"GOT7 2019 WORLD TOUR KEEP SPINNING\"暂时回国录制的真人秀节目,拍摄前与制作组见面,回忆了他们在「GOT7的HARD CARRY 2.5」..."}'
>>> json.loads(jsonstr)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/onlyzdd/.apps/conda/envs/main/lib/python3.9/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "/home/onlyzdd/.apps/conda/envs/main/lib/python3.9/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/home/onlyzdd/.apps/conda/envs/main/lib/python3.9/json/decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Invalid \escape: line 1 column 101 (char 100)
>>> jsonstr = jsonstr.replace('\&', '')
>>> json.loads(jsonstr)
{'datePublished': '2019-11-13', 'genre': ['真人秀'], 'duration': 'PT1H0M', 'description': 'GOT7正在举行世界巡演#34;GOT7 2019 WORLD TOUR KEEP SPINNING#34;暂时回国录制的真人秀节目,拍摄前与制作组见面,回忆了他们在「GOT7的HARD CARRY 2.5」...'}

这表明原来你的字符串就不是完整的用Unicode编码的数据,建议提前把数据编码统一起来。

你可以试一下类似json.loads(jsonstr,"gbk")来解析

总之一个原则就是处理的数据统一编码,如果不统一就要想办法统一起来,否则容易出错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏