Flask-SQLAlchemy查询含特殊字符数据时打印异常及编码问题求助
解决Flask-SQLAlchemy查询结果含特殊字符的打印编码异常问题
问题分析
- 原始代码报错
UnicodeEncodeError,是因为Windows控制台默认使用cp1252编码,无法处理部分Unicode特殊字符(比如ñ),导致打印中断。 - 直接调用
encode("utf-8")后,输出的是字节对象(带b''前缀),且出现\xc3\x83\xc2\x91这类异常编码,本质是字符串被双重编码(原UTF-8字节被错误解码为cp1252后,再次编码为UTF-8)。
解决方案
方案1:修改控制台编码为UTF-8
先将Windows控制台编码切换为UTF-8(代码页65001),再直接打印字符串:
- 控制台预执行命令:
chcp 65001
- 代码中强制设置标准输出编码:
import sys import io # 重置标准输出/错误流为UTF-8编码 sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8') def shows(): with Operator.app.app_context(): u = Operator.db.session.query(Operator.Subject).all() for index, row in enumerate(u): print(row.complete)
方案2:修复字符串的双重编码问题
针对已被错误编码的字符串,先还原为正确的Unicode:
def shows(): with Operator.app.app_context(): u = Operator.db.session.query(Operator.Subject).all() for index, row in enumerate(u): raw_str = row.complete # 修复双重编码:先将错误解码的字符串转回字节,再用UTF-8解码 fixed_str = raw_str.encode('latin-1').decode('utf-8') print(fixed_str)
注:latin-1是单字节编码,能完整保留原始字节信息,避免解码丢失数据
方案3:直接指定print的输出编码(Python 3.7+)
利用Python 3.7+新增的print函数encoding参数,强制输出UTF-8编码:
def shows(): with Operator.app.app_context(): u = Operator.db.session.query(Operator.Subject).all() for index, row in enumerate(u): print(row.complete, encoding='utf-8')
内容的提问来源于stack exchange,提问作者Pampayacu
相关产品推荐
相关产品推荐

