关于更改Windows上控制台、新Terminal终端以及VSCode中PowerShell的输出编码为UTF8

本文介绍了如何区分PowerShell和Windows PowerShell,并详细讲解如何将PowerShell的[Console]::OutputEncoding更改为UTF8,包括修改系统区域设置、注册表、使用chcp命令以及通过配置文件的方法,同时提到了在VSCode集成终端中的设置和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

居然被平台自动设置为 VIP文章 了。。。也不征求作者意见的??!重新发布一下

1. 区分PowerShell 和 Windows Powershell

PowerShell 在 6.0 版之前只存在于Windows,基于.NET Framework构建,两词无区别。
从 6.0 开始基于.NET Core重新构建了PowerShell,开始可以跨平台(Windows、macOS 和 Linux),而Windows Powershell仍专属于Windows,两词区别开来,分别指两个不同的东西。
截至目前 Windows Powershell最新为5.1版,PowerShell已到7.2版。两者日常使用基本相同,但也有一定区别,按下不表,可看官方文档。在Windows上两者可共存,独立使用。

官方文档:
https://docs.microsoft.com/zh-cn/powershell/scripting/whats-new/migrating-from-windows-powershell-51-to-powershell-7
https://docs.microsoft.com/zh-cn/powershell/scripting/whats-new/differences-from-windows-powershell

2. 涉及PowerShell编码的两个变量

  • [Console]::OutputEncoding :控制台用于写入输出(即屏幕显示)的编码,使用的默认代码页(CodePage)由Windows系统区域设置确定,不论是PowerShell 还是Windows Powershell,简体中文为936代码页。单纯解决显示汉字乱码之类问题的话就是要改这个。

https://docs.microsoft.com/zh-cn/dotnet/api/system.console.outputencoding

  • $OutputEncoding :为PowerShell和其他程序交互传送数据时使用的编码,6.0版本之前的Windows Powershell 默认为ASCII,之后的Powershell默认为UTF8。

3.更改 [Console]::OutputEncoding 编码为UTF8

注:以下基于 Windows PowerShell 说明,且简称为 PowerShell。
3.0 修改系统区域设置

Beta内容,会有很多问题,不推荐。
更改系统区域设置

3.1 修改注册表
  • 操作:HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe内更改(如没有则自己添加)CodePage(DWORD值十进制65001)。
    修改注册表CodePage

  • 效果:对于直接启动PowerShell.exe有效,通过快捷方式启动、在新的Windows Terminal终端启动、在VSCode集成终端启动 均无效。

  • 原因解释:快捷方式启动PowerShell和直接运行PowerShell.exe有区别,快捷方式上可以附加设置(可以对快捷方式右键查看属性),会覆盖exe程序本身的设置。Terminal和VSCode不确定,可能是同理吧。

3.2 chcp 命令

chcp是源于cmd的命令,用于改变代码页CodePage,PowerShell中也可使用,但需在启动PowerShell时使用才有效,因为 .net会缓存启动时的代码页,在PowerShell会话中再使用chcp改变代码页会被忽略。所以,可以实现目标,但要注意使用方法.。

  • 控制台:
    在CMD或PowerShell中运行powershell -NoExit -Command "chcp 65001",可以开启一个UTF8的PowerShell。
    注:powershell -? 可以看 -NoExit、-Command的含义。

  • 新的Windows Terminal终端(未起效,不知原因):
    设置 -> 配置文件 - > Windows PowerShell -> 命令行,在%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe 后面添加 -NoExit -Command "chcp 65001"没效果,不知为何。

  • VSCode 集成终端:
    在设置settings.json 中修改如下项,添加 args 参数内容,可以在启动PowerShell集成终端时更改代码页为UTF8。
    VSCode中通过chcp更改集成终端的PowerShell编码
    注:此方法稍不优雅,不管想不想都无法看到PowerShell正常显示的Logo(版权文字),而且还会输出一行Active code page: 65001,看网上的方案在 chcp 65001 后加 > null 重定向,可以消除这行输出,但我加了后是重定向到一个以null为名的文件里去了…… 总之,做不到无感、透明。

3.3 添加PowerShell配置文件(推荐)
  • 通过启动时加载的配置文件对PowerShell实现自定义。关于配置文件的官方文档:

https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_profiles

  • 操作:
    ① PowerShell中运行New-Item -ItemType File -Path $PROFILE -Force ,会在 C:\Users\<用户名>\Documents\WindowsPowerShell 下创建配置文件(当前用户、当前主机类型)Microsoft.PowerShell_profile.ps1。
    配置文件

② 用记事本等打开(初始为空),编辑输入$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding,将三个编码相关变量都置为UTF8。
③PowerShell中运行 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser,设置当前用户的配置文件执行策略为RemoteSigned(网上下载的需要可信签名、本机编写的不需要)。

关于执行策略: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies

④重启启动PowerShell(控制台、终端Terminal或VSCode集成终端中)即可。

4. 其他:

  • 为正确显示 unicode还需选择合适的字体,需用TrueType字体,如Consolas、Lucida Console。
  • 重要参考资料:

https://stackoverflow.com/questions/57131654/using-utf-8-encoding-chcp-65001-in-command-prompt-windows-powershell-window

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值