根本原因是字符编码链路断裂,需检查响应头Content-Type是否声明UTF-8,强制response.encoding='utf-8'或用response.content.decode('utf-8-sig'),清除零宽字符、BOM及HTML标签,并确保脚本、终端和文件保存均为UTF-8。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

腾讯混元API返回结果出现中文乱码、方块字、问号或空字符,常见于本地Python脚本调用后打印或保存时文本不可读,根本原因集中在字符编码链路断裂——从API响应头声明、HTTP解码、到Python字符串处理环节任一环未对齐UTF-8都会触发此问题。
检查响应头Content-Type是否声明UTF-8
在requests响应对象中打印response.headers.get('Content-Type'),确认返回值包含charset=utf-8。若缺失或为charset=gbk、iso-8859-1等,说明服务端未正确声明编码,需强制干预解码逻辑。
这一步不能跳过:混元API官方要求响应必须使用UTF-8,但部分代理或中间网关可能篡改Header,导致Python默认按ISO-8859-1解码原始bytes。
强制指定响应内容解码方式
方法一:调用response.content.decode('utf-8')替代response.text
response.text会依据headers自动解码,而response.content是原始字节流。当Content-Type缺失或错误时,直接decode可绕过误判。注意:若实际响应并非UTF-8,此处会抛UnicodeDecodeError,需捕获后尝试utf-8-sig(自动剥离BOM)。
方法二:设置response.encoding = 'utf-8'后再取response.text
在获取response后立即执行response.encoding = 'utf-8',强制requests后续所有.text访问按UTF-8解析。该操作必须在首次访问response.text前完成,否则无效。
清洗零宽字符与不可见控制符
第一步:用正则清除零宽空格(U+200B)、零宽非连接符(U+200C)、零宽连接符(U+200D)等干扰字符:
【这些字符肉眼不可见,但会破坏JSON解析和终端显示,且混元部分流式响应中偶有插入】
第二步:用re.sub(r'[\u200b-\u200f\u202a-\u202e]', '', clean_text)批量移除
第三步:检查并剔除BOM头(\ufeff),尤其当response.content以\xef\xbb\xbf开头时,直接decode('utf-8-sig')比decode('utf-8')更安全。
验证并剥离HTML标签(如返回含富文本)
有些混元智能体配置了HTML输出模板,返回内容实际是带<p><strong>的HTML片段,而非纯文本。此时直接打印会导致浏览器渲染逻辑错乱,在终端显示为乱码标签。
用html.unescape()还原HTML实体(如&→&),再用正则或bs4提取text:re.sub(r']+>', '', html_str)
若未做此步,response.text看似正常,但写入文件或传给下游NLP模块时会因标签残留引发分词异常或编码报错。
确保Python源文件与终端环境均为UTF-8
第一步:在Python脚本首行添加# -*- coding: utf-8 -*-
第二步:检查终端locale:Linux/macOS运行locale命令,确认LC_ALL或LANG含.UTF-8;Windows用户需在cmd中执行chcp 65001
第三步:保存JSON文件时显式指定encoding='utf-8':json.dump(data, f, ensure_ascii=False, indent=2)
【ensure_ascii=False不可省略,否则中文会转成\u4f60\u597d形式,不是乱码而是转义,但不符合阅读需求】


















