Codex 编辑文件乱码

解决 Codex 修改文件后中文乱码问题:根源在终端编码,不在 VS Code!

关键词:Codex、中文乱码、VS Code、PowerShell、UTF-8、终端编码、无 BOM

问题现象

使用 GitHub Copilot(或 Codex)修改包含中文的文件时,保存后打开发现中文变成乱码,比如:

我爱中文 → 实际应为 “我爱中文”

很多人第一反应是:“是不是 VS Code 编码设置错了?” 但其实——问题不在编辑器,而在终端!

真正的根源

Codex 并不直接在 VS Code 编辑器里写文件,而是通过终端(Terminal)执行命令(如 echo、sed、PowerShell 脚本等)来修改文件内容。

流程如下:

  1. Codex 生成修改命令(例如 Set-Content file.txt "你好"

  2. 命令在 终端中执行

  3. 终端以当前编码将字节写入文件

  4. VS Code 读取文件 → 如果编码不匹配 → 乱码

所以,乱码的根本原因是:终端编码 ≠ 编辑器编码。

解决方案:双端统一为 UTF-8

要彻底解决,必须同时配置:

VS Code 使用 UTF-8

终端(PowerShell/CMD)默认使用 UTF-8

第一步:配置 VS Code 为 UTF-8

打开 VS Code 设置(Ctrl + ,),切换到 settings.json,添加:

{"files.encoding": "utf8","files.autoGuessEncoding": true}
  • "files.encoding": "utf8":默认以 UTF-8 保存文件

  • "files.autoGuessEncoding": true:打开文件时自动检测编码(尤其对带 BOM 的文件友好)

这一步确保 VS Code 读写一致。

第二步:配置 PowerShell 终端为 UTF-8(重点)

:one: 确认你用的是哪个 PowerShell?

在终端运行:

$PSVersionTable.PSVersion
  • 5.x → Windows 自带的 Windows PowerShell(旧版)

  • 7.x → PowerShell 7+(推荐升级)

强烈建议升级到 PowerShell 7,对 UTF-8 支持更好。

方法一:使用 winget(推荐)

在 PowerShell 5.1 中执行:

winget install --id Microsoft.PowerShell -e

安装完成后,关闭所有终端窗口并重新打开。

验证是否安装成功

pwsh -v

如果输出类似

PowerShell 7.x.x

:two: 找到你的 Profile 文件路径

$PROFILE

常见路径:

Windows PowerShell 5.1: C:\Users\<用户名>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

PowerShell 7+: C:\Users\<用户名>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

:three: 编辑 Microsoft.PowerShell_profile.ps1

:warning: 注意:不要用 Add-Content -Encoding UTF8,它会写入 带 BOM 的 UTF-8,可能引发其他工具兼容问题。 我们需要的是 UTF-8 无 BOM。

修改内容如下:

# UTF-8 console/file encoding
chcp 65001 | Out-Null
[Console]::InputEncoding  = [System.Text.UTF8Encoding]::new()
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
$OutputEncoding = [System.Text.UTF8Encoding]::new()
$PSDefaultParameterValues['Out-File:Encoding']    = 'utf8'
$PSDefaultParameterValues['Set-Content:Encoding'] = 'utf8'
$PSDefaultParameterValues['Add-Content:Encoding'] = 'utf8'
$PSDefaultParameterValues['Get-Content:Encoding'] = 'utf8'
$PSDefaultParameterValues['Select-String:Encoding'] = 'utf8'

:four: 验证是否生效

'中文测试' | Set-Content .\test.txt

Get-Content .\test.txt

如果输出 “中文测试” 而非乱码,说明配置成功!