1. Trae 里跑 Python,中文为什么变成“锘”和问号
你在 Trae 里写了一段再普通不过的 Python:
print("你好,世界") print("订单创建成功")点下 Code Runner 的三角按钮,输出窗口却给你甩回来一堆锘、?、ä½ å¥½之类的东西。代码没错,逻辑没错,就是中文不认人。这个问题在 Trae 里出现的频率不低,尤其是 Windows 环境加 Code Runner 插件的组合,几乎每个刚上手的人都会撞一次。
先把结论说清楚:Trae 中 Python 中文乱码,本质是编码链路里有一环没对齐 UTF-8。这条链路上有四个角色——Python 源文件本身的编码、Python 解释器读写标准输出时用的编码、Code Runner 拼出来的执行命令、以及终端/输出窗口的显示编码。只要其中任意一个还在用 GBK 或系统默认代码页,中文就会在某一环被“翻译错”,最终显示成乱码。
Code Runner 的坑在于:它默认不是直接在系统终端里跑,而是把命令丢进一个 OUTPUT 面板执行,这个面板的编码行为和你手动开终端不完全一样。再加上 Windows 上 Python 的sys.stdout默认编码经常跟着系统区域设置走(可能是 cp936),print出去的中文在写入管道时就已经变形了。
所以这篇不聊虚的,直接给你一条能复制的排查链路:先定位是哪一环出问题,再用PYTHONIOENCODING把解释器输出锁死成 UTF-8,最后改settings.json让 Code Runner 每次执行都带上这个变量。顺带说一句,如果你平时还要在 Trae 里接模型做代码补全或对话,TaoToken 可以作为统一的 Key/API 通道,把模型调用和本地脚本调试放在同一套配置习惯里,省得来回换。
适合谁看:在 Trae 里用 Code Runner 跑 Python、输出中文就乱码的人;想搞清楚PYTHONIOENCODING到底管什么的人;以及希望把编辑器配置一次改好、以后不再反复踩坑的人。
2. 动手前先把 TaoToken 的 Key 和通道准备好
这一节不是必须的——你完全可以只改settings.json就解决乱码。但既然场景里提到了 TaoToken 统一 Key,我就把它放在前面说清楚,因为后面验证脚本时,我会顺带演示一个调用模型接口的小例子,那时候需要用到 Key。
TaoToken 在这里的角色是统一的 API 通道:你注册一次、拿一个 Key,就能在 Trae 里通过它访问不同的模型,不用为每个模型单独配一套地址和密钥。对于经常在编辑器里做代码问答、让模型帮忙解释报错的人来说,这种“一个 Key 走天下”的方式确实省事。
操作路径很直接:
打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册并登录。然后进控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,在 API Keys 页面创建一个新 Key。这个 Key 就是后面所有调用的凭证,复制出来先存好,别直接贴在会提交到 Git 的文件里。
如果你只是想先跑通模型对话看看效果,可以直接用模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,在网页里发几条消息,确认 Key 能用、通道是通的。这一步不写代码,纯点选,适合先建立信心。
接口地址统一用 https://taotoken.net/api ,注意这个地址不带任何查询参数,是干净的 API 根路径。至于 Coding Plan 这类长期编码场景,可以看 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它更适合把模型能力嵌进日常写代码的流程里,而不是一次性问答。
提示:Key 属于敏感信息。在 Trae 里配置时,优先用环境变量或单独的本地配置文件,不要硬编码进
settings.json这种可能被同步或分享的文件。
准备好 Key 之后,我们回到乱码本身。下面进入真正的配置环节。
3. 可复制的 settings.json 配置:让 Code Runner 带上 PYTHONIOENCODING
Trae 的设置文件和 VS Code 同源,都是settings.json。打开方式:命令面板(Ctrl+Shift+P)里搜 “Open User Settings (JSON)”,或者直接找设置界面的右上角那个“打开设置(JSON)”图标。
核心思路是改 Code Runner 的执行命令模板,让它在调用 Python 之前先设置PYTHONIOENCODING=utf8,并且加上-u关闭缓冲。下面这段可以直接复制,注意它是 JSON,别多逗号少引号:
{ "code-runner.executorMap": { "python": "set PYTHONIOENCODING=utf8 && python -u" }, "code-runner.runInTerminal": true, "code-runner.clearPreviousOutput": true, "files.encoding": "utf8", "files.autoGuessEncoding": false }逐项解释一下,别照抄完不知道为什么:
code-runner.executorMap里的python这一行,是 Code Runner 执行.py文件时实际拼出来的命令。set PYTHONIOENCODING=utf8是 Windows 的写法,作用是给这次进程设置环境变量,强制 Python 的标准输入输出用 UTF-8。&&表示前一条成功后再执行后面。python -u里的-u让 stdout/stderr 不缓冲,输出实时刷出来,也避免缓冲层再做一次编码转换。
code-runner.runInTerminal设为true很关键。默认 Code Runner 在 OUTPUT 面板跑,那个面板的编码行为不好控制;改成在终端里跑,终端本身的编码更透明,配合PYTHONIOENCODING基本就稳了。
files.encoding设成utf8,保证 Trae 读写源文件时用 UTF-8。files.autoGuessEncoding关掉,避免它“自作聪明”猜成 GBK。
如果你用的是 macOS 或 Linux,set要换成export,命令变成:
{ "code-runner.executorMap": { "python": "export PYTHONIOENCODING=utf8 && python -u" } }改完保存,Ctrl+S。这里有个容易忽略的点:settings.json里如果已经有code-runner.executorMap,不要重复写两个同名键,合并进去就行,否则后面的会覆盖前面的。
另外,如果你不想动全局设置,只想给当前项目单独配,可以在项目根目录建.vscode/settings.json,内容一样。Trae 会优先读项目级配置。
4. 验证请求:跑一个带中文的脚本,确认输出干净
配置改完,必须验证,不然你不知道是配置生效了还是碰巧好了。
新建一个test_encoding.py:
# -*- coding: utf-8 -*- import sys print("你好,世界") print("当前 stdout 编码:", sys.stdout.encoding) print("订单创建成功,金额 ¥199.00")第一行是编码声明,虽然 Python 3 默认源文件就是 UTF-8,但写上不亏,明确意图。第二行打印sys.stdout.encoding,这是关键——如果输出是utf-8,说明PYTHONIOENCODING生效了;如果还是cp936或gbk,说明配置没被 Code Runner 读到。
用 Code Runner 跑(快捷键一般是 Ctrl+Alt+N),观察终端输出。正常应该是:
你好,世界 当前 stdout 编码: utf-8 订单创建成功,金额 ¥199.00如果sys.stdout.encoding显示utf-8且中文正常,恭喜,链路通了。
再补一个更贴近实际的验证:写一段调用 TaoToken 接口的脚本,顺便确认 Key 和编码都不打架。用requests举例:
import os import requests api_key = os.environ.get("TAOTOKEN_API_KEY") url = "https://taotoken.net/api/v1/chat/completions" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } payload = { "model": "gpt-4o-mini", "messages": [ {"role": "user", "content": "用一句中文解释什么是编码"} ] } resp = requests.post(url, headers=headers, json=payload, timeout=30) data = resp.json() print("模型回复:", data["choices"][0]["message"]["content"])运行前先把 Key 放进环境变量,Windows 下可以临时set TAOTOKEN_API_KEY=你的Key,或者在 Trae 的终端配置里注入。这段脚本同时验证了两件事:中文请求体发出去没乱码,中文回复打出来也没乱码。如果模型回复的中文正常显示,说明从网络到终端的整条编码链路都是干净的。
注意:上面用的模型名只是示例,实际可用模型以 TaoToken 控制台或文档里列出的为准。接口路径和鉴权方式参考接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,别照搬别家平台的格式。
5. 本篇常见错排查:改了还是乱码怎么办
配置照抄了,重启了,还是乱码?按下面顺序排查,基本能定位到具体哪一环。
第一种:sys.stdout.encoding还是 cp936。说明PYTHONIOENCODING没传进去。检查settings.json里code-runner.executorMap的键名是不是python(小写),Trae 对大小写敏感。再检查是不是项目级settings.json覆盖了用户级,两处都看一眼。还有一种情况:你装了 Python 插件,它自带的运行按钮不走 Code Runner,走的是插件自己的执行逻辑,那executorMap就不生效。确认你是用 Code Runner 的入口在跑。
第二种:终端里中文正常,OUTPUT 面板里乱码。这就是code-runner.runInTerminal没设成true。OUTPUT 面板的编码不好控,直接改成终端运行最省事。
第三种:源文件本身存成了 GBK。打开 Trae 右下角的编码指示器,看当前文件是不是 UTF-8。如果是 GBK,用“通过编码重新打开”再“以 UTF-8 保存”。files.autoGuessEncoding设成false可以防止它下次又猜错。
第四种:Windows 终端本身的代码页是 936。在终端里敲chcp看输出。如果是 936,可以临时chcp 65001切到 UTF-8。但更推荐的做法是让PYTHONIOENCODING兜底,因为改代码页只影响当前终端会话,换个窗口又回去了。
第五种:print的内容来自文件读取,文件是 GBK。这时候乱码不在输出环节,在读取环节。读文件时显式指定encoding="utf-8",或者用errors="replace"先看个大概。别指望PYTHONIOENCODING能修读取编码,它只管标准输入输出。
第六种:命令里的&&在某些 shell 下不认。如果你把默认终端换成了 PowerShell 或 Git Bash,set VAR=value && cmd的语法可能不对。PowerShell 里应该用$env:PYTHONIOENCODING="utf8"; python -u。确认你的默认终端是什么,再选对应写法。
排查时有个通用技巧:在脚本开头加一行print(sys.stdout.encoding, sys.getdefaultencoding(), sys.getfilesystemencoding()),三个编码一次打出来,对照着看是哪一层没对齐。
6. 把配置固化下来,下次直接复用
乱码这种事,修一次就该让它永远别再出现。我的做法是把settings.json里那几行当成模板,换电脑、重装 Trae 时直接贴回去。code-runner.executorMap加上PYTHONIOENCODING和-u,runInTerminal打开,files.encoding锁 UTF-8,这四件事做完,Trae 里跑 Python 的中文输出基本不会再翻车。
如果你在 Trae 里还要接模型做代码辅助,Key 的管理也建议一次配好。TaoToken 的 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 可以创建和管理密钥,接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 里有具体的请求格式。把 Key 放进环境变量,脚本里用os.environ读,既安全又不用每次改代码。
最后留一个我自己的习惯:每次新建 Python 项目,先在根目录放一个.vscode/settings.json,把编码相关的配置写死。这样不管全局设置怎么变,项目内的行为是一致的。中文乱码说到底是个配置一致性问题,配置对齐了,它就只是个一次性动作,而不是每次都要重新查的麻烦。