UnicodeEncodeError: 'charmap' 编解码器无法编码字符... 问题

4 投票
2 回答
7993 浏览
提问于 2025-04-18 15:59

在这里,我知道这个问题可能被问过很多次,但我想说的是,我已经尝试了很多不同的答案,但都没有解决我的问题。

import json
def parse(fn):
    results = []
    with open(fn) as f:
        json_obj = json.loads(open(fn).read())
        for r in json_obj["result"]:
            print(r["name"])

parse("wine.json")

我其实就是在打开一个json文件,然后从里面提取一些值。显然,每当我读取一个包含unicode字符的值时,就会出现错误。

Traceback (most recent call last):
  File "json_test.py", line 9, in <module>
    parse("wine.json")
  File "json_test.py", line 7, in parse
    print(r["name"])
  File "C:\Python34\lib\encodings\cp850.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u201c' in position
15: character maps to <undefined>

正如其他帖子里的人说的,我也尝试过对它进行编码等等,但无论我怎么编码或解码,都会出现类似的错误。请帮帮我。

2 个回答

1

我最后找到的一个可能的临时解决办法(如果有人有更好的答案就另说)是使用 Unidecode 这个工具。可惜的是,我把所有的重音符号都去掉了,但也许有人能找到解决这个问题的方法。

16

在你尝试打印字符串之前,一切都是正常的。要打印字符串,首先需要将它从纯Unicode格式转换成你的输出设备能支持的字节序列。这就需要用到一个叫encode的过程,把它转换成合适的字符集,而Python默认使用的是cp850,这是Windows控制台的默认设置。

从Python 3.4开始,你可以通过在命令提示符下输入以下命令来设置Windows控制台使用UTF-8:

chcp 65001

只要你把窗口设置成使用包含该字符的字体,这样做应该能解决你的问题。

Python 3.6开始,这个步骤就不再必要了——Windows控制台一直都有完整的Unicode支持,而Python现在也在使用这个功能,而不是以前那种简单的代码页输入输出。Unicode在控制台中直接就能用

撰写回答