xututu 发表于 2022-8-11 21:23

powershell、cmd终端修改编码

本帖最后由 xututu 于 2022-8-11 21:28 编辑

# **powershell、cmd终端修改编码**

文章修改时间2022年8月11日00:31:39

## (https://docs.microsoft.com/zh-cn/powershell/)

官方文档:

### (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)



中文版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配置文件(推荐)

### [配置文件文件](https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.2)

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` - 有关详细信息,请参阅[此答案](https://stackoverflow.com/a/49481797/45375)。

```javascript
$OutputEncoding = ::InputEncoding = ::OutputEncoding = New-Object System.Text.UTF8Encoding
```

- 例如,这是一种以`$PROFILE`编程方式添加这一行的快速而简单的方法:

```php
'$OutputEncoding = ::InputEncoding = ::OutputEncoding = New-Object System.Text.UTF8Encoding' + ::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。

要改的内容

   ```py
$OutputEncoding = ::OutputEncoding = (new-object System.Text.UTF8Encoding $false)
$env:PYTHONIOENCODING = "utf-8"
   ```

或者

```
$OutputEncoding = ::InputEncoding = ::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 为您创建此值:

```sql
# 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 字符串值

1. 右键 > 新建 > 字符串值 (REG_SZ)

2. 命名为

   ```
    autorun
   ```

3. 双击,将值修改为

   ```
   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>               |

Ishisashi 发表于 2022-8-13 21:39

后面 Code Page 表其实也不全,还是参考https://docs.microsoft.com/zh-cn/windows/win32/intl/code-page-identifiers好了。
顺便一提,CP 936 严格来说不是 GB/T 2312,而是 GBK。
页: [1]
查看完整版本: powershell、cmd终端修改编码