问题:
最近我发现在 windows 的 vscode 中运行 UTF-8编码 的 C++源文件 后 终端输出的中文会乱码
可能原因:
文件编码 与终端编码不一致导致的(或许更加复杂)
实验代码:
C++
void solve()
{
string a; cin>>a;
cout<<a<<endl;
string b="sadas阿三发射点发";
cout<<b<<endl;
}
实验结果 <math xmlns="http://www.w3.org/1998/Math/MathML"> → \to </math>→本地终端:
-
对于cmd终端 将编码改成65001(UTF-8)编码就不会乱码了
-
对于PowerShell终端 将编码改成65001(UTF-8)编码依旧会乱码
实验结果 <math xmlns="http://www.w3.org/1998/Math/MathML"> → \to </math>→vscode终端:
-
对于cmd终端 ,vscode 会自动将编码改成65001(UTF-8)编码,并且输出不会乱码
-
对于PowerShell终端 ,vscode 也会自动将编码改成65001(UTF-8)编码 ,但是输出依旧会乱码(指的是通过
.\test.exe
执行时输出的中文会乱码)。原因可能是PowerShell 的编码处理机制与CMD不同:
- CMD 是传统的命令行工具,直接依赖系统代码页
chcp
设置,且对 UTF-8 的支持较为直接,设置chcp 65001
后,CMD 会尝试将输出视为 UTF-8。 - PowerShell 是基于 .NET 的现代终端,其输入输出编码由以下因素控制:
[System.Console]::OutputEncoding
(输出编码)[System.Console]::InputEncoding
(输入编码)- 默认使用系统的 ANSI 编码 (如 GBK),而非完全遵循
chcp
设置。
解决方案:修改 PowerShell 配置文件
-
在 PowerShell 终端执行以下命令打开 PowerShell 配置文件:
powershellcode $PROFILE
-
添加以下内容:
powershell# 设置 PowerShell 终端编码为 UTF-8 # 控制 PowerShell 向外部程序传递数据时的编码(例如通过管道 | 或重定向 > 发送数据到其他进程),默认跟随系统区域设置(如 GBK)。 $OutputEncoding = [System.Text.Encoding]::UTF8 # 控制 从控制台输入设备(如键盘)读取的文本的编码,即用户输入到 PowerShell 的字符如何被解码,默认与系统活动代码页一致(如 GBK)。 [Console]::InputEncoding = [System.Text.Encoding]::UTF8 # 控制 外部程序输出到 PowerShell 控制台的文本的解码方式,即外部程序(如 C++ 编译的 .exe)的输出如何被显示, 默认与系统活动代码页一致(如 GBK)。 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
-
重启 PowerShell 。
再次尝试后发现 PowerShell 终于不乱码了!!!!!
- CMD 是传统的命令行工具,直接依赖系统代码页
总结:
-
如果想 本地终端 和 vscode终端 中的 cmd 一直都不会乱码的话,可以直接修改注册表使得 cmd 的默认编码是 65001(UTF-8) 编码。
-
打开注册表编辑器 :按
Win + R
→ 输入regedit
→ 回车。 -
定位到以下注册表项 :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
-
修改 OEMCP 的值 :双击右侧的
OEMCP
<math xmlns="http://www.w3.org/1998/Math/MathML"> → \to </math>→ 将数值数据从936
改为65001
。
4. 重启电脑:修改后需重启系统才能生效。 -
-
如果想 本地终端 和 vscode终端 中的 PowerShell 一直都不会乱码的话,可以直接 修改 PowerShell 配置文件。
现在对于我个人来说乱码的问题倒是解决了,至于这样操作后会不会出现新的问题?对于其他的电脑管不管用?我也不知道,谁让我这个人满脑子只想着自己呢