Python3中将含混合UTF-8转义字符的类字节串转换为正常文本
问题根源
你遇到的问题本质是对bytes类型做了错误的字符串转换:
requests库的resp.content返回值是原始字节(bytes类型),你以文本模式("w")打开文件时,write()方法只接受字符串类型,直接传bytes必然报TypeError。- 你之前用
str(resp.content)做转换是完全错误的:这个操作不会把字节按编码解码成人类可读的文本,只会把字节对象的字面表示(也就是带b''前缀、\x开头转义序列的打印内容)转成普通字符串,这就是为什么你检查变量类型是str,但内容看起来还是字节串结构的原因。
解决方案
分两种场景处理:
修复已经生成的错误字符串
如果你已经拿到了这种形如b'xxx'的错误字符串(存在str_data变量里),可以用ast.literal_eval先把它解析回真实的bytes对象,再按UTF-8解码即可:
import ast # 将字节串的字符串表示还原为真实bytes对象 real_byte_data = ast.literal_eval(str_data) # 按UTF-8解码得到正常文本 correct_text = real_byte_data.decode("utf-8")
执行后correct_text就是和原始字节匹配的正确文本,你给出的字节样例解码结果为:
Sample data plus some Japanese characters ずぜ日銀だけ違うのか?———— and then more data
注:你写的预期结果里开头的「なぜ」和字节内容不匹配,属于笔误,上述解码结果完全和你提供的原始字节对应。
从源头修正代码,避免后续生成错误数据
后续写请求和存储逻辑时二选一即可,绝对不要用str()直接转换bytes类型:
- 方案1:直接用requests自带的文本解码能力,手动指定编码避免自动识别错误
resp = requests.get(get_url) # 强制指定响应编码为UTF-8 resp.encoding = "utf-8" # 文件写入时也指定UTF-8编码,避免不同系统默认编码不一致出问题 with open(self.export_file, "w", encoding="utf-8") as f: f.write(resp.text)
- 方案2:以二进制模式写入文件,不需要做编解码转换
resp = requests.get(get_url) # 注意打开模式为"wb"(二进制写入),可以直接写bytes类型 with open(self.export_file, "wb") as f: f.write(resp.content)
踩坑提醒:Python3中str是Unicode文本类型,bytes是原始字节序列,两者转换必须显式指定编码,直接用
str()转bytes、或者不指定编码直接调用encode()/decode()都很容易出乱码问题。
内容的提问来源于stack exchange,提问作者JRomeo
相关产品推荐
相关产品推荐

