Python中适配上标(NG²)与latin-1编码的读取方案问询
解决Python写入含上标字符时的UnicodeEncodeError问题
首先咱们拆解下你遇到的核心问题:
为什么会触发编码错误?
你在Fedora20的Python3.3环境下,用open(playlist_name, 'w')打开文件时没有指定编码参数,Python3会默认使用系统的首选编码——在这个环境里大概率是ASCII。而上标字符²(Unicode编码U+00B2)不在ASCII的字符范围内,所以写入字符串时直接触发了UnicodeEncodeError。
至于print(line)能正常工作,是因为print会自动适配终端的编码,把字符串转换成终端能识别的格式输出,但文件写入不会做这个自动适配。
另外你尝试的ndt.write(line+"\n").decode('utf-8')是典型的用法错误:write()方法返回的是写入的字符数(一个整数),整数当然没有decode方法,这就是你遇到AttributeError的原因。
正确的解决方案
方案1:打开文件时指定编码(推荐)
直接在open()里指定encoding参数,选用支持²的编码即可。推荐用UTF-8(兼容性最强,支持所有Unicode字符),或者你之前习惯的Latin-1(注意:²确实属于ISO-8859-1/Latin-1字符集,指定这个编码也能正常写入):
# 用UTF-8打开(推荐,未来兼容性更强) ndt = open(playlist_name, 'w', encoding='utf-8') # 或者用Latin-1编码 ndt = open(playlist_name, 'w', encoding='latin-1')
之后直接写入字符串即可,不需要额外的编码/解码操作:
ndt.write(line + "\n")
方案2:二进制模式打开并手动编码
如果你习惯手动控制编码流程,可以用二进制模式wb打开文件,把字符串编码成字节后再写入:
ndt = open(playlist_name, 'wb') # 用UTF-8编码写入 ndt.write((line + "\n").encode('utf-8')) # 或者用Latin-1编码写入 ndt.write((line + "\n").encode('latin-1'))
关于不同系统的差异补充
- WinA(Python3.4)能正常运行,是因为Windows下Python3.4的默认文件编码是
cp1252(Windows版的Latin-1扩展,包含²),所以即使没指定编码也能写入。 - WinB和WinC的curl退出码1问题,大概率和网络环境、curl配置或者Spotify API访问权限有关,和编码问题无关,你可以给curl加
-v参数查看详细错误输出排查。
内容的提问来源于stack exchange,提问作者delaflota
相关产品推荐
相关产品推荐

