powershell、cmd终端修改编码
文章修改时间2022年8月11日00:31:39
官方文档:
中文版win10 Powershell默认编码为GB2312,而编程中常用编码格式为UTF-8。在UTF-8格式下编写的中文输出信息,在Powershell中执行程序就会显示乱码,这时需要更改编码格式。
1、chcp 命令临时修改
chcp是源于cmd的命令,用于改变代码页CodePage,PowerShell中也可使用,但需在启动PowerShell时使用才有效,因为 .net会缓存启动时的代码页,在PowerShell会话中再使用chcp改变代码页会被忽略。所以,可以实现目标,但要注意使用方法.
控制台:
在CMD或PowerShell中运行
powershell -NoExit -Command "chcp 65001"
可以开启一个UTF8的PowerShell。
或直接在powershell中执行
chcp命令
chcp 65001
2、 添加PowerShell配置文件(推荐)
PowerShell 支持多个配置文件。 此外,PowerShell 主机程序还可以支持自己的特定于主机的配置文件。
例如,PowerShell 控制台支持以下基本配置文件。 配置文件按优先顺序列出。 第一个配置文件的优先级最高。
说明 |
路径 |
所有用户、所有主机 |
Windows - $PSHOME\Profile.ps1;Linux - /usr/local/microsoft/powershell/7/profile.ps1;macOS - /usr/local/microsoft/powershell/7/profile.ps1 |
所有用户,当前主机 |
Windows - $PSHOME\Microsoft.PowerShell_profile.ps1;Linux - /usr/local/microsoft/powershell/7/Microsoft.Powershell_profile.ps1;macOS - /usr/local/microsoft/powershell/7/Microsoft.Powershell_profile.ps1 |
当前用户、所有主机 |
Windows - $Home[我的 ]Documents\PowerShell\Profile.ps1;Linux - ~/.config/powershell/profile.ps1;macOS - ~/.config/powershell/profile.ps1 |
当前用户,当前主机 |
Windows - $Home[我的 ]Documents\PowerShell\Microsoft.PowerShell_profile.ps1;Linux - ~/.config/powershell/Microsoft.Powershell_profile.ps1;macOS - ~/.config/powershell/Microsoft.Powershell_profile.ps1 |
配置文件路径包括以下变量:
- 变量
$PSHOME
,用于存储 PowerShell 的安装目录
- 变量
$Home
,用于存储当前用户的主目录
此外,托管 PowerShell 的其他程序可以支持自己的配置文件。 例如,Visual Studio Code支持以下特定于主机的配置文件。
说明 |
路径 |
所有用户,当前主机 |
$PSHOME\Microsoft.VSCode_profile.ps1 |
当前用户,当前主机 |
$Home[我的 ]Documents\PowerShell\ Microsoft.VSCode_profile.ps1 |
在 PowerShell 帮助中,“CurrentUser,Current Host”配置文件是最常称为“你的 PowerShell 配置文件”的配置文件。
-
- Windows PowerShell
$OutputEncoding
- 有关详细信息,请参阅此答案。
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding
- 例如,这是一种以
$PROFILE
编程方式添加这一行的快速而简单的方法:
'$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding' + [Environment]::Newline + (Get-Content -Raw $PROFILE -ErrorAction SilentlyContinue) | Set-Content -Encoding utf8 $PROFILE
Windows举例操作
文件位置位于C:\Windows\System32(没有要自己建)
1、%windir%\system32\WindowsPowerShell\v1.0\profile.ps1
它作用于所有用户、所有的Shell。
2、%windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1
作用于所有用户,但只作用于Microsoft.PowerShell这个shell
下面位于文档目录
操作:
① PowerShell中运行
New-Item -ItemType File -Path $PROFILE -Force
会在 C:\Users\<用户名>\Documents\WindowsPowerShell 下创建配置文件(当前用户、当前主机类型)Microsoft.PowerShell_profile.ps
3、%UserProfile%\Documents\WindowsPowerShell\profile.ps1
作用于当前用户的所有shell。
4、%UserProfile%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
作用于当前用户的Microsoft.PowerShell这个shell。
要改的内容
$OutputEncoding = [Console]::OutputEncoding = (new-object System.Text.UTF8Encoding $false)
$env:PYTHONIOENCODING = "utf-8"
或者
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding
3、系统区域设置
- 输入win + r,输入
intl.cpl
(在控制面板中打开区域设置)
- 依次点击
- 管理>更改系统区域设置>勾选UTF-8提供全球语言支持>确认>重启
3.注册表修改
对于cmd.exe
通过注册表定义一个自动运行命令,AutoRun
键值
(仅限当前用户)
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
或(所有用户)
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor
- 例如,您可以使用 PowerShell 为您创建此值:
# Auto-execute `chcp 65001` whenever the current user opens a `cmd.exe` console
# window (including when running a batch file):
Set-ItemProperty 'HKCU:\Software\Microsoft\Command Processor' AutoRun 'chcp 65001 >NUL'
操作
① 打开注册表编辑器
输入win + r,输入 regedit
计算机\HKEY_CURRENT_USER\Software\Microsoft\Command Processor
或者
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
② 添加 autorun 字符串值
-
右键 > 新建 > 字符串值 (REG_SZ)
-
命名为
autorun
-
双击,将值修改为
chcp 65001
可以避免每次使用都输出 Active code page: 65001
对于PowerShell
输入win + r,输入 regedit
修改注册表的这个位置:
计算机\HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe
找到codepage代码页的名称
双击CodePage修改键值为指定编码的数字代号(10进制"自己想要的编码" ;推荐“65001”)
- 效果:对于直接启动PowerShell.exe有效,通过快捷方式启动、在新的Windows Terminal终端启动、在VSCode集成终端启动 均无效。
- 原因解释:快捷方式启动PowerShell和直接运行PowerShell.exe有区别,快捷方式上可以附加设置(可以对快捷方式右键查看属性),会覆盖exe程序本身的设置。Terminal和VSCode不确定,可能是同理吧。
3.永久修改
chcp命令使用的数字编码表
代码页 |
国家(地区)或语言 |
437 |
美国 |
708 |
阿拉伯文(ASMO 708) |
720 |
阿拉伯文(DOS) |
850 |
多语言(拉丁文 I) |
852 |
中欧(DOS) - 斯拉夫语(拉丁文 II) |
855 |
西里尔文(俄语) |
857 |
土耳其语 |
860 |
葡萄牙语 |
861 |
冰岛语 |
862 |
希伯来文(DOS) |
863 |
加拿大 - 法语 |
865 |
日耳曼语 |
866 |
俄语 - 西里尔文(DOS) |
869 |
现代希腊语 |
874 |
泰文(Windows) |
932 |
日文(Shift-JIS) |
<u>936</u> |
<u>中国 - 简体中文(GB2312)</u> |
949 |
韩文 |
950 |
繁体中文(Big5) |
1200 |
Unicode |
1201 |
Unicode (Big-Endian) |
1250 |
中欧(Windows) |
1251 |
西里尔文(Windows) |
1252 |
西欧(Windows) |
1253 |
希腊文(Windows) |
1254 |
土耳其文(Windows) |
1255 |
希伯来文(Windows) |
1256 |
阿拉伯文(Windows) |
1257 |
波罗的海文(Windows) |
1258 |
越南文(Windows) |
20866 |
西里尔文(KOI8-R) |
21866 |
西里尔文(KOI8-U) |
28592 |
中欧(ISO) |
28593 |
拉丁文 3 (ISO) |
28594 |
波罗的海文(ISO) |
28595 |
西里尔文(ISO) |
28596 |
阿拉伯文(ISO) |
28597 |
希腊文(ISO) |
28598 |
希伯来文(ISO-Visual) |
38598 |
希伯来文(ISO-Logical) |
50000 |
用户定义的 |
50001 |
自动选择 |
50220 |
日文(JIS) |
50221 |
日文(JIS-允许一个字节的片假名) |
50222 |
日文(JIS-允许一个字节的片假名 - SO/SI) |
50225 |
韩文(ISO) |
50932 |
日文(自动选择) |
50949 |
韩文(自动选择) |
51932 |
日文(EUC) |
51949 |
韩文(EUC) |
52936 |
简体中文(HZ) |
65000 |
Unicode (UTF-7) |
<u>65001</u> |
<u>Unicode (UTF-8)</u> |