You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:39:07