一、系统自带的cmd.exe 以及 Git的bash.exe、sh.exe、git-bash.exe和git-cmd.exe,和PowerShell默认使用“当前系统区域设置”设定好的936 (ANSI/OEM - 简体中文 GBK)语言编码。
1、[当前代码页] 的936 (ANSI/OEM - 简体中文 GBK) 是导致中文乱码的原因
在控制面板→区域→管理→更改系统区域设置,当前系统区域设置(C) 为:中文(简体,中国)。其对应的语言编码是:936 (ANSI/OEM - 简体中文 GBK)。
系统自带的cmd.exe 以及 Git的bash.exe、sh.exe、git-bash.exe和git-cmd.exe 和Powershell以此为依据,在注册项CodePage设置为936。
导致“属性”→ “选项”中,其【当前代码页】的编码固定在936 (ANSI/OEM - 简体中文 GBK)。
2、这样会导致什么问题呢?
(1) 问题一: 【属性】选项的【字体】无法识别自定义文字样式,【默认值】选项可选自定义字体样式,却无法覆盖【属性】选项
【属性】里面,【选项】的“当前代码页”编码为936 (ANSI/OEM - 简体中文 GBK)时,【字体】无法识别自定义文字样式,比如:CaskaydiaMono NFM。此处只能选择类似于“新宋体”、“隶书”、“楷体”等样式。
选择【默认值】时,虽然可以选择自定义下载的字体,但是无法覆盖【属性】选项里面的字体样式,字体的样式还是“新宋体”
(2) 问题二:在使用git命令输出中文时会有乱码
因为【当前代码页】编码(即控制台编码格式)固定在936 (ANSI/OEM - 简体中文 GBK),而这些控制台依赖的git.exe默认编码格式为utf-8,由于编码格式不一致,程序运行时往往会出现中文乱码的情况。
此时在D:/Git/etc目录下,往配置文件 (例如:bash.bashrc、profile、gitconfig) 中设置编码为utf-8的语句也没有任何作用。比如下图:bash.bashrc中设置编码为utf-8,对解决控制台的中文乱码没有任何作用。
3、解决方法:把注册表中Console(控制台)的CodePage(当前代码页)选项的编码修改为65001(utf-8)
(1) Win+R,输入regedit,定位到 [计算机\HKEY_CURRENT_USER\Console\]
(2) 把常用的终端(控制台)的CodePage设置为65001(utf-8)
有CodePage选项的,点击【十进制】的基数,设置为65001(utf-8)。没有CodePage选项的请自行新建。
① 系统自带的CMD
② D:/Git/bin/bash.exe
③ D:/Git/bin/sh.exe
因为sh.exe没有CodePage选项,我们需要右键→新建→DWORD(32位)值。命名该项为:CodePage。十进制值为65001。
④ D:/Git/bin/git-bash.exe 和 D:/Git/bin/git-cmd.exe
同上设置,我们需要右键→新建→DWORD(32位)值。命名该项为:CodePage。十进制值为65001。
⑤ 单独使用PowerShell时,控制台输出中文乱码
[1] 方法1:在Microsoft.PowerShell_profile.ps1配置文件中设置utf-8编码
在PowerShell中输入$profile,查看.ps1配置文件的路径
编辑Microsoft.PowerShell_profile.ps1。在里面添加以下语句。
#8. 设置Powershell控制台输出结果的编码为utf-8,解决输出中文乱码的问题 $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 |
[2] 方法2:打开regedit,定位到:计算机\HKEY_CURRENT_USER\Console\。给所有PowerShell选项新建类型为DWORD(32位)值的CodePage项,点击【基数:十进制】,写入数值:65001 (utf-8),从源头解决中文乱码问题。
以上方法只能解决:[单独使用PowerShell时,控制台输出中文乱码] 的问题
⑥ 使用Terminal来挂靠PowerShell时,控制台输出中文乱码
当我们使用Terminal来挂靠PowerShell时,Terminal会默认使用系统的GBK编码,覆盖了PowerShell在注册表设置的CodePage值:65001(utf-8)。导致输出到控制台时会有中文乱码。
按方法1的做法,不仅可以避免上述问题。单独使用PowerShell时也会避免中文乱码。
在PowerShell中输入$profile,查看.ps1配置文件的路径
编辑Microsoft.PowerShell_profile.ps1。在里面添加以下语句。
#8. 设置Powershell控制台输出结果的编码为utf-8,解决输出中文乱码的问题 $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 |
再次测试,不再有中文乱码。
(3) 总结
① 对于系统自带的cmd.exe 以及 Git的bash.exe、sh.exe、git-bash.exe和git-cmd.exe ,遇到在控制台输出中文乱码的问题,建议进入regedit注册表中,新建或修改DWORD类型的CodePage的值,统一为:65001 (utf-8)
② 单独使用Powershell.exe,遇到在控制台输出中文乱码的问题,有两种解决方法:
方法1:通过$profile定位到.ps1配置文件,输入以下语句:
#8. 设置Powershell控制台输出结果的编码为utf-8,解决输出中文乱码的问题 $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 |
方法2:进入regedit注册表中,新建或修改DWORD类型的CodePage的值,统一为:65001 (utf-8)
③ 使用Terminal来挂靠PowerShell时,遇到在控制台输出中文乱码的问题,有一种解决方法:
方法1:通过$profile定位到.ps1配置文件,输入以下语句:
#8. 设置Powershell控制台输出结果的编码为utf-8,解决输出中文乱码的问题 $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 |
所以对于PowerShell来说,使用方法1可以直接解决控制台输出中文乱码的问题。方法2可用可不用。不会影响方法1。两个方法同时使用也行。