使用Kivy开发移动应用触发UnicodeDecodeError编码错误如何解决?
错误原因
这个UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 356: character maps to <undefined>报错是字符编码不匹配导致的,具体触发逻辑如下:
你读取存储名人名言的文本文件时,Python默认调用当前操作系统的默认编码(Windows系统下默认是charmap/CP936/GBK编码)解码文件,但你的文本文件实际是UTF-8编码,文件里包含了charmap编码无法识别的特殊字符(比如0x9d对应的是UTF-8编码下的右双引号、全角标点、特殊符号等),找不到对应映射就会触发崩溃。
Kivy跨平台开发场景下,不同操作系统默认编码不一致,更容易出现这类问题。
排查步骤
- 首先定位报错对应的代码行,找到读取名言文本的IO操作逻辑,确认打开文件时是否未指定编码参数
- 用代码编辑器(比如VS Code)打开你的名言文本文件,查看编辑器右下角标注的文件实际编码,确认是否为UTF-8
- 检查文本内容中是否包含全角标点、特殊英文引号、emoji等非ASCII字符
修复方案
- 最通用的修复方式是读取文件时明确指定编码为UTF-8,将原有打开文件的代码:
# 错误写法,未指定编码 with open("quotes.txt") as f: content = f.read()
修改为:
# 明确指定UTF-8编码读取 with open("quotes.txt", encoding="utf-8") as f: content = f.read()
- 如果文件存在部分无法解码的异常字符,也可以增加错误处理参数避免直接崩溃:
- 传入
errors="ignore"直接忽略无法解码的字符 - 传入
errors="replace"将无法解码的字符替换为�符号
示例代码:
with open("quotes.txt", encoding="utf-8", errors="ignore") as f: content = f.read() - 传入
- 如果确认你的文本文件实际编码不是UTF-8,比如是GBK编码,将
encoding参数对应修改为gbk即可。 - Kivy跨端打包场景下,统一指定UTF-8编码读取文件,也可以避免安卓、iOS端运行时出现同类编码问题。
内容的提问来源于stack exchange,提问作者giridhar yerra
相关产品推荐
相关产品推荐

