您正在查看静态缓存页面 · 查看完整动态版本 · 登录 参与讨论

PowerShell 中文乱码问题完全解决指南

✨步子哥 (steper) 2026年01月30日 15:04 0 次浏览

在使用 PowerShell 查看 UTF-8 编码的中文文件时,经常会遇到乱码问题。本文总结了多种解决方案,从临时修复到永久配置,帮助你彻底解决这个问题。

问题现象

# 使用 type 或 Get-Content 查看中文文件时出现乱码
type chinese.txt
# 输出:         

问题原因

PowerShell 中有两个重要的编码设置:

  1. [Console]::OutputEncoding - 控制控制台输出编码
  2. $OutputEncoding - 控制向外部程序输出时的编码
默认情况下,$OutputEncoding 可能是 US-ASCII,导致中文显示乱码。

解决方案

方法一:临时设置当前会话(快速修复)

# 设置控制台输出编码为 UTF-8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# 设置 PowerShell 输出编码为 UTF-8
$OutputEncoding = [System.Text.Encoding]::UTF8

优点:立即生效,无需重启
缺点:仅当前会话有效,关闭窗口后失效


方法二:读取文件时指定编码(针对单个文件)

# 使用 Get-Content 的 -Encoding 参数
Get-Content -Path "文件路径" -Encoding UTF8

# 简写形式
gc "文件路径" -Encoding UTF8
cat "文件路径" -Encoding UTF8
type "文件路径" -Encoding UTF8

优点:精确控制,不影响其他操作
缺点:每次读取都需要指定


方法三:永久设置(推荐)

通过修改 PowerShell 配置文件,让设置在每次启动时自动生效。

1. 查看配置文件路径

# 查看当前用户当前主机的配置文件路径
$PROFILE

# 查看所有配置文件类型
$PROFILE | Get-Member -MemberType NoteProperty

常见的配置文件路径:

配置文件类型路径
当前用户 + 当前主机C:\Users\用户名\OneDrive\文档\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
当前用户 + 所有主机C:\Users\用户名\OneDrive\文档\WindowsPowerShell\profile.ps1
所有用户 + 当前主机C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
所有用户 + 所有主机C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1

2. 创建并编辑配置文件

# 创建配置文件目录(如果不存在)
$profileDir = Split-Path $PROFILE -Parent
if (!(Test-Path $profileDir)) { 
    New-Item -ItemType Directory -Path $profileDir -Force
}

# 创建配置文件并写入 UTF-8 设置
@'
# 设置 PowerShell 使用 UTF-8 编码
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
'@ | Set-Content -Path $PROFILE -Encoding UTF8 -Force
⚠️ 注意:使用单引号 @'...'@ 包裹 Here-String,防止变量被提前展开!

3. 验证配置文件

# 查看配置文件内容
Get-Content $PROFILE

正确内容应该是:

# 设置 PowerShell 使用 UTF-8 编码
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8

4. 重启 PowerShell

关闭并重新打开 PowerShell 窗口,设置即可生效。


方法四:使用 .NET StreamReader(高级场景)

# 使用 .NET StreamReader 精确控制编码
$reader = New-Object System.IO.StreamReader("文件路径", [System.Text.Encoding]::UTF8)
$content = $reader.ReadToEnd()
$reader.Close()
Write-Output $content

方法五:chcp 命令(CMD 兼容方式)

# 设置代码页为 UTF-8 (65001)
chcp 65001

注意:这只是临时修改控制台代码页,效果有限。


常见错误与解决

错误:无法将"$OutputEncoding"项识别为 cmdlet

$OutputEncoding : 无法将"$OutputEncoding"项识别为 cmdlet...
+ `$OutputEncoding = [System.Text.Encoding]::UTF8
+ ~~~~~~~~~~~~~~~~

原因:配置文件中使用双引号 Here-String @"...@" 时,$ 被转义成了 ` $ `,导致写入文件的是字面量 $OutputEncoding 而不是变量。 **解决**:使用单引号 Here-String @'...'@

@'
$OutputEncoding = [System.Text.Encoding]::UTF8
'@ | Set-Content -Path $PROFILE -Encoding UTF8
--- ## 验证设置是否生效 ### 查看当前编码设置
# 查看控制台输出编码
[Console]::OutputEncoding

# 查看 PowerShell 输出编码
$OutputEncoding
如果设置正确,两者都应该显示
utf-8`(CodePage: 65001)。

测试中文显示

# 创建一个测试文件
"中文字符测试" | Set-Content -Path "test.txt" -Encoding UTF8

# 查看文件内容
type test.txt

如果显示正常的中文,说明设置成功!


总结对比

方法适用场景持久性复杂度
临时设置快速修复当前会话❌ 临时⭐ 简单
指定编码读取偶尔读取 UTF-8 文件❌ 每次指定⭐ 简单
**配置文件****长期使用**✅ **永久**⭐⭐ 中等
StreamReader需要精确控制编码❌ 临时⭐⭐⭐ 复杂
chcpCMD 兼容❌ 临时⭐ 简单

推荐:日常使用选择 方法三(配置文件),偶尔使用选择 方法二(指定编码)


参考

讨论回复

0 条回复

还没有人回复