看起来这根本不是 Youtube API 问题,而是 Python 问题。请注意,您的错误不是编码错误,而是解码错误;您偶然发现了 Python 的工作方式(无论好坏)。Python 中的很多很多函数会将 unicode 数据转换为 8 位字符串而不是原生 unicode 对象,使用带有十六进制数字的 \x 来表示大于 127 的字符。(一种这样的方法是 SubRipFile 对象的“from_string”方法) '正在使用。)因此数据仍然是 unicode,但对象是字符串。因此,当您随后强制转换为 unicode 对象(通过在您提供的示例代码中使用 unicode 对象的 'join' 方法触发)时,Python 将采用 ascii 编解码器(8 位字符串的默认值) ,
有几种解决方案。
1) 你可以明确地告诉 Python,当你运行你的 join 方法时不要假设一个 ascii 编解码器,但我总是很难做到这一点(并且在每种情况下都这样做)。所以我不会尝试一些示例代码。
2)您可以放弃本机 unicode 对象,而只使用 8 位字符串来处理您的 unicode 数据;这只需要您更改此行:
body = u'\n'.join(lines[2:])
对此:
body = '\n'.join(lines[2:])
但是,这种方法有潜在的缺点——同样,您必须确保在每种情况下都这样做;您也不会利用 Python 原生的 unicode 对象(这可能会或可能不会在您的代码中成为问题)。
3)您可以使用低级“编解码器”模块来确保从一开始就将数据转换为本机 unicode 对象,而不是使用 8 位字符串。通常,您以这种方式完成这样的任务:
import codecs
f=codecs.open('captions.srt',encoding='utf-8')
l=f.readlines()
f.close()
type(l[0]) # will be unicode object rather than string object
当然,您有使用返回字符串的 SubRipFile 对象的复杂性,但是您可以通过使用编解码器通过 StringIO 对象发送它(因此编解码器模块可以将翻录的数据视为文件)来解决这个问题。 encode() 方法等。Python 文档对所有这些都有很好的部分。
祝你好运。