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

Flask-SQLAlchemy查询含特殊字符数据时打印异常及编码问题求助

解决Flask-SQLAlchemy查询结果含特殊字符的打印编码异常问题

问题分析

  1. 原始代码报错UnicodeEncodeError,是因为Windows控制台默认使用cp1252编码,无法处理部分Unicode特殊字符(比如ñ),导致打印中断。
  2. 直接调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:19:32