OpenClaw在macOS终端中遇到中文显示为方块、问号或空白时,很多人第一反应是字体或路径配置问题。但经过深入排查,真正根源在于Node.js进程的I/O流未显式声明使用UTF-8编码。即使系统环境变量设置正确,底层读写仍会走默认的locale fallback路径。这个问题虽不算严重bug,却是最令人困扰的隐蔽性故障。

你可以自行验证——在终端执行openclaw models list,如果输出的模型名显示为??????或〹这类HTML实体,同时locale | grep UTF-8确认了LANG=en_US.UTF-8。那么问题不在系统环境,而是OpenClaw自身作为Node.js运行时未强制指定编码。
这一步验证必不可少,否则后续所有环境配置都只是治标不治本。因为OpenClaw启动时会缓存初始编码策略,单纯重启终端无法解决问题。
修改OpenClaw主入口文件(永久生效)
首先定位OpenClaw全局安装的主入口脚本路径:
which openclaw
通常返回/usr/local/bin/openclaw或$(npm prefix -g)/bin/openclaw。用文本编辑器打开此文件——需添加sudo权限。
找到以#!/usr/bin/env node开头的行,紧接其后插入两行代码。位置必须正确:在shebang之后、任何require之前。原因很简单:若位置错误,当Node.js的I/O流初始化完成后再设置编码,就为时已晚。
process.env.NODE_OPTIONS = "--experimental-strip-types";
process.stdout.setEncoding("utf8"); process.stderr.setEncoding("utf8"); process.stdin.setEncoding("utf8");
重装核心依赖并刷新缓存
接下来进入OpenClaw项目目录——注意不是全局bin目录,而是真正的项目目录:
cd $(npm prefix -g)/lib/node_modules/openclaw
首先删除现有node_modules,再强制重建:
rm -rf node_modules
NODE_OPTIONS="--enable-source-maps" npm install --no-package-lock --ignore-scripts
这一步的核心目的是绕过npm缓存中旧版的buffer处理逻辑。此前安装的依赖很可能走系统默认编码的加载路径,导致新声明的编码设置无法被子模块继承。同时必须带上--ignore-scripts,因为预编译脚本若按旧编码加载配置,乱码会立刻复发。
终端级双保险配置(补漏)
方法一:直接注入环境变量启动
不要直接运行openclaw,改用以下命令:
NODE_OPTIONS="--experimental-strip-types" LANG=en_US.UTF-8 openclaw gateway run
方法二:Zsh函数封装(日常使用推荐)
在~/.zshrc末尾添加两行:
alias oc="NODE_OPTIONS='--experimental-strip-types' LANG=en_US.UTF-8 openclaw"
oc() { NODE_OPTIONS="--experimental-strip-types" LANG=en_US.UTF-8 command openclaw "$@"; }
执行source ~/.zshrc后,所有以oc开头的命令都会自动带上编码上下文,无需每次手动输入冗长参数。
验证最终效果
第一步:重启终端——此步骤不能省略,需彻底清理旧shell环境。
第二步:运行oc models list。
第三步:观察输出。检查模型名——例如“通义千问”、“DeepSeek-V3”等中文名称——是否正常显示,没有方块、问号或截断现象。
第四步:顺便检查日志文件~/.openclaw/logs/gateway.log,搜索中文关键词,确认日志内容已按UTF-8原样记录。
