【Clion】【文件编码】Clion内置控制台中文字体乱码的解决方案及编码格式调整
<h1 id="1-问题描述">1. 问题描述</h1><p>在使用Clion时,在保证文件编码,项目编码,属性文件的默认编码等均为UTF-8的情况下,当代码输出中存在中文字符时,内置控制台显示的输出为乱码。</p>
<p><img src="https://img2024.cnblogs.com/blog/1595231/202510/1595231-20251004084555285-157775108.png"></p>
<p><img src="https://img2024.cnblogs.com/blog/1595231/202510/1595231-20251004084618776-2138285667.png"></p>
<h1 id="2-尝试解决方案">2. 尝试解决方案</h1>
<p>在CLion中解决内置控制台乱码问题,主要需要统一项目编码、控制台编码和系统环境编码。以下是具体步骤:</p>
<h2 id="21-第一次尝试解决">2.1 第一次尝试解决</h2>
<h3 id="1-检查并设置项目文件编码执行后未解决问题"><strong>1. 检查并设置项目文件编码(执行后未解决问题)</strong></h3>
<p>CLion的文件编码设置可能影响控制台输出的编码格式:</p>
<ol>
<li>打开 <code>File > Settings</code>(Windows/Linux)或 <code>CLion > Preferences</code>(macOS)。</li>
<li>进入 <code>Editor > File Encodings</code>。</li>
<li>确保以下选项均设置为 <strong>UTF-8</strong>:
<ul>
<li><code>Global Encoding</code>(全局编码)</li>
<li><code>Project Encoding</code>(项目编码)</li>
<li><code>Default encoding for properties files</code>(属性文件默认编码)</li>
</ul>
</li>
<li>点击 <code>OK</code> 保存。</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/1595231/202510/1595231-20251004084642665-320539442.png"></p>
<h3 id="2-修改控制台输出编码执行后未解决问题"><strong>2. 修改控制台输出编码(执行后未解决问题)</strong></h3>
<p>如果项目编码正确但控制台仍乱码,需单独设置控制台编码:</p>
<ol>
<li>打开运行/调试配置:点击顶部菜单栏 <code>Run > Edit Configurations</code>。</li>
<li>在左侧列表中选择你的运行配置(如 <code>main</code> 或自定义配置)。</li>
<li>在右侧 <code>Configuration</code> 标签页中,找到 <code>Environment</code> 区域,点击 <code>Environment variables</code> 右侧的 <code>...</code>。</li>
<li>点击 <code>+</code> 添加环境变量:
<ul>
<li><code>Name</code> 输入 <code>LC_ALL</code>(Linux/macOS)或 <code>PYTHONUTF8</code>(Windows,针对部分场景)</li>
<li><code>Value</code> 输入 <code>en_US.UTF-8</code>(强制UTF-8编码)</li>
<li>(Windows可选)添加 <code>CONSOLE_ENCODING</code> 并设置为 <code>UTF-8</code></li>
</ul>
</li>
<li>保存配置并重新运行程序。</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/1595231/202510/1595231-20251004084736902-860035214.png"></p>
<h3 id="3-针对windows系统的额外设置执行后未解决问题"><strong>3. 针对Windows系统的额外设置(执行后未解决问题)</strong></h3>
<p>Windows默认控制台编码为GBK,可能与CLion的UTF-8冲突,需额外处理:</p>
<ol>
<li>打开CLion的VM配置文件:
<ul>
<li>点击 <code>Help > Edit Custom VM Options</code>。</li>
<li>在打开的文件中添加一行:<code>Dfile.encoding=UTF-8</code></li>
<li>保存并重启CLion。</li>
</ul>
</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/1595231/202510/1595231-20251004084747094-1104158814.png"></p>
<ol start="2">
<li>(可选)修改Windows系统控制台编码:
<ul>
<li>按下 <code>Win + R</code>,输入 <code>cmd</code> 打开命令提示符。</li>
<li>执行命令 <code>chcp 65001</code>(切换到UTF-8编码)。</li>
<li>重启CLion后尝试运行程序。</li>
</ul>
</li>
</ol>
<h3 id="4-检查代码中的输出编码未手动指定输出编码故未执行"><strong>4. 检查代码中的输出编码(未手动指定输出编码,故未执行)</strong></h3>
<p>如果程序中手动指定了输出编码(如使用<code>setlocale</code>等函数),可能导致冲突:</p>
<ul>
<li>确保代码中未强制设置与UTF-8冲突的编码(如GBK)。</li>
<li>示例:若使用C语言的<code>printf</code>输出中文,需确保代码文件为UTF-8编码,且未通过<code>setlocale(LC_ALL, "zh_CN.GBK")</code>强制设置GBK。</li>
</ul>
<h3 id="5-针对cmake项目的补充设置未尝试"><strong>5. 针对CMake项目的补充设置(未尝试)</strong></h3>
<p>如果是CMake项目,可在<code>CMakeLists.txt</code>中添加编码相关编译选项:</p>
<pre><code># 确保编译器使用UTF-8编码处理源文件
if (MSVC)
# Visual Studio编译器
add_compile_options("/source-charset:utf-8")
else()
# GCC/Clang编译器
add_compile_options(-finput-charset=UTF-8)
endif()
</code></pre>
<p>通过以上步骤,基本可以解决CLion内置控制台的乱码问题。核心原则是:<strong>确保项目文件编码、控制台环境编码、程序输出编码三者统一为UTF-8</strong>。如果是Linux/macOS系统,通常只需完成前两步即可;Windows系统可能需要额外配置系统或VM选项。</p>
<h2 id="22-执行了第一次尝试中的123方案后仍未解决进行第二次尝试">2.2 执行了第一次尝试中的1,2,3方案后,仍未解决,进行第二次尝试</h2>
<p>如果前面的步骤仍未解决乱码问题,可以尝试以下更深入的解决方案,针对不同场景进一步排查:</p>
<h3 id="1-强制clion控制台编码针对java底层配置执行后未解决问题"><strong>1. 强制CLion控制台编码(针对Java底层配置)(执行后未解决问题)</strong></h3>
<p>CLion基于Java开发,其控制台编码可能受Java虚拟机(JVM)参数影响,可直接强制指定:</p>
<ol>
<li>
<p>打开 <code>Help > Edit Custom VM Options</code>(如果没有该文件,会提示创建)。</p>
</li>
<li>
<p>添加以下两行配置(覆盖默认编码):</p>
<pre><code>-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8
</code></pre>
</li>
<li>
<p><strong>重启CLion</strong> 使配置生效,重新运行程序测试。</p>
</li>
</ol>
<h3 id="2-针对cc程序的特殊处理执行后成功解决问题但需要每次指定编码故以此为切入点"><strong>2. 针对C/C++程序的特殊处理(执行后成功解决问题,但需要每次指定编码,故以此为切入点)</strong></h3>
<p>如果是C/C++程序输出乱码,可能是编译器对字符串常量的编码处理问题:</p>
<ol>
<li>
<p><strong>在代码中显式指定输出编码转换</strong>(适用于Windows系统):</p>
<pre><code class="language-cpp">#include <iostream>
#include <windows.h> // 仅Windows需要
int main() {
// 将控制台输出编码设置为UTF-8(Windows特有)
SetConsoleOutputCP(65001);
// 测试输出
std::cout << "中文测试" << std::endl;
return 0;
}
</code></pre>
<p>注意:<code>SetConsoleOutputCP</code> 是Windows API,Linux/macOS无需此代码(默认支持UTF-8)。</p>
</li>
<li>
<p><strong>检查编译器编码选项</strong>:</p>
<ul>
<li>
<p>对于GCC/Clang,在CMakeLists.txt中添加:</p>
<pre><code>add_compile_options(-fexec-charset=UTF-8) # 确保字符串常量编译为UTF-8
</code></pre>
</li>
<li>
<p>对于MSVC(Visual Studio编译器),添加:</p>
<pre><code>add_compile_options("/execution-charset:utf-8")
</code></pre>
</li>
</ul>
</li>
</ol>
<h3 id="3-切换clion的控制台类型未尝试"><strong>3. 切换CLion的控制台类型(未尝试)</strong></h3>
<p>CLion有两种控制台模式,可尝试切换:</p>
<ol>
<li>打开 <code>File > Settings > Tools > Terminal</code>。</li>
<li>在 <code>Shell path</code> 中,默认可能是内置控制台(如 <code>cmd.exe</code> 或 <code>powershell</code>),可尝试:
<ul>
<li>若为Windows,切换为 <code>powershell</code>(可能比cmd有更好的UTF-8支持)。</li>
<li>勾选 <code>Run with legacy console</code>(仅Windows,兼容旧控制台模式)。</li>
</ul>
</li>
<li>重启CLion后测试。</li>
</ol>
<h3 id="4-检查系统区域设置windows关键步骤执行后成功解决问题应该是问题的关键所在后文叙述原因"><strong>4. 检查系统区域设置(Windows关键步骤)(执行后成功解决问题,应该是问题的关键所在,后文叙述原因)</strong></h3>
<p>Windows的系统区域设置可能强制覆盖程序编码:</p>
<ol>
<li>打开 <code>控制面板 > 时钟和区域 > 区域</code>。</li>
<li>进入 <code>管理</code> 标签页,点击 <code>更改系统区域设置</code>。</li>
<li>勾选 <code>Beta 版:使用Unicode UTF-8提供全球语言支持</code>(Windows 10及以上)。</li>
<li>点击 <code>确定</code> 并重启电脑,让系统默认编码为UTF-8。</li>
</ol>
<h3 id="5-清理缓存并重建项目未尝试"><strong>5. 清理缓存并重建项目(未尝试)</strong></h3>
<p>CLion的缓存可能导致配置未生效:</p>
<ol>
<li>点击 <code>File > Invalidate Caches...</code>。</li>
<li>勾选 <code>Clear file system cache and local history</code>,点击 <code>Invalidate and Restart</code>。</li>
<li>重启后,重新构建项目(<code>Build > Rebuild Project</code>)并运行。</li>
</ol>
<h3 id="6-终极验证使用外部终端未尝试"><strong>6. 终极验证:使用外部终端(未尝试)</strong></h3>
<p>如果内置控制台始终有问题,可尝试使用系统外部终端验证是否是CLion本身的问题:</p>
<ol>
<li>打开 <code>Run > Edit Configurations</code>。</li>
<li>在运行配置中,勾选 <code>Run in external terminal</code>(在配置的底部)。</li>
<li>运行程序,观察系统自带终端(如cmd、powershell、终端)是否显示正常。
<ul>
<li>若外部终端正常,说明问题出在CLion内置控制台,可暂时使用外部终端,或尝试更新CLion版本。</li>
<li>若外部终端也乱码,说明是系统编码或程序本身的问题(回到步骤二检查代码)。</li>
</ul>
</li>
</ol>
<h3 id="总结">总结</h3>
<p>乱码问题的核心是“<strong>编码不匹配</strong>”:<strong>程序输出的编码(如UTF-8)与控制台期望的编码(如GBK)不一致</strong>。以上步骤从CLion配置、JVM参数、编译器选项、系统设置等多个层面强制统一为UTF-8,逐步排查后通常能解决问题。如果是旧版本CLion,建议升级到最新版(2023+),对UTF-8的支持更完善。</p>
<h2 id="23-第二次尝试成功解决问题后需探明其中原因">2.3 第二次尝试成功解决问题后,需探明其中原因</h2>
<p>要理解这个问题,我们需要先搞清楚 <strong>Windows 控制台的编码机制</strong> 与 <strong>程序输出编码</strong> 的匹配关系。问题的本质是:<strong>Windows 控制台默认编码与你的程序输出编码不匹配</strong>,而 <code>SetConsoleOutputCP(65001)</code> 是手动强制统一编码的临时解决方案。</p>
<h3 id="1-为什么需要-setconsoleoutputcp65001">1. 为什么需要 <code>SetConsoleOutputCP(65001)</code>?</h3>
<p>Windows 系统的控制台(CMD/PowerShell)有一个 <strong>“输出代码页”</strong>(Code Page)的概念,用于解析程序输出的字节流并显示为文字。默认情况下:</p>
<ul>
<li>中文 Windows 的控制台默认代码页是 <strong>936(GBK编码)</strong>,它只能正确解析 GBK 编码的字节流。</li>
<li>C++ 程序(在 CLion 中)默认使用 <strong>UTF-8 编码</strong>(因为配置了项目编码为 UTF-8),字符串常量(如 <code>std::cout << "中文"</code>)会被编译为 UTF-8 字节流。</li>
</ul>
<p>当程序输出 UTF-8 编码的“中文”时,控制台用默认的 GBK 编码去解析这些字节,就会出现乱码。而 <code>SetConsoleOutputCP(65001)</code> 的作用是 <strong>强制将控制台的输出代码页切换为 UTF-8(65001 是 UTF-8 的代码页编号)</strong>,让控制台能正确解析程序输出的 UTF-8 字节流,因此中文可以正常显示。</p>
<h3 id="2-如何避免每次写代码都加这行">2. 如何避免每次写代码都加这行?</h3>
<p>核心是让 <strong>Windows 控制台默认使用 UTF-8 编码</strong>,或让程序与控制台的编码“自动匹配”。以下是一劳永逸的解决方案:</p>
<h4 id="方案-1修改-windows-系统默认编码推荐">方案 1:修改 Windows 系统默认编码(推荐)</h4>
<p>让 Windows 全局启用 UTF-8 编码支持,控制台会默认使用 UTF-8 代码页,无需手动调用 <code>SetConsoleOutputCP</code>:</p>
<ol>
<li>打开 <strong>控制面板 → 时钟和区域 → 区域</strong>(或直接在系统设置中搜索“区域”)。</li>
<li>切换到 <strong>“管理”</strong> 标签页,点击 <strong>“更改系统区域设置”</strong>。</li>
<li>勾选 <strong>“Beta 版:使用 Unicode UTF-8 提供全球语言支持”</strong>(Windows 10/11 有此选项)。</li>
<li>点击“确定”,重启电脑生效。</li>
</ol>
<p>重启后,Windows 控制台(CMD/PowerShell)的默认代码页会变为 65001(UTF-8),与你的程序输出编码一致,中文可直接正常显示。</p>
<p><img src="https://img2024.cnblogs.com/blog/1595231/202510/1595231-20251004084811672-31023232.png"></p>
<h4 id="方案-2在-clion-中配置全局启动脚本适用于单个项目">方案 2:在 CLion 中配置全局启动脚本(适用于单个项目)</h4>
<p>如果不想修改系统设置,可以在 CLion 中为项目配置一个“全局初始化代码”,自动执行 <code>SetConsoleOutputCP(65001)</code>:</p>
<ol>
<li>
<p>创建一个头文件(如 <code>console_utf8.h</code>),内容如下:</p>
<pre><code class="language-cpp">#pragma once
#ifdef _WIN32
#include <windows.h>
// 全局对象,程序启动时自动调用构造函数
struct ConsoleUTF8Initializer {
ConsoleUTF8Initializer() {
SetConsoleOutputCP(65001); // 启动时自动设置UTF-8代码页
}
};
static ConsoleUTF8Initializer console_utf8_initializer; // 静态对象,全局初始化
#endif
</code></pre>
</li>
<li>
<p>在你的项目 <strong>CMakeLists.txt</strong> 中,将这个头文件所在目录添加到包含路径,并确保所有源文件间接包含它(例如在项目的公共头文件中引入):</p>
<pre><code>include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 假设放在include目录
</code></pre>
</li>
<li>
<p>之后所有源文件编译时,会自动触发全局对象的构造函数,在程序启动时执行 <code>SetConsoleOutputCP(65001)</code>,无需手动添加。</p>
</li>
</ol>
<h4 id="方案-3切换-clion-终端为-powershell可能更友好">方案 3:切换 CLion 终端为 PowerShell(可能更友好)</h4>
<p>CMD 对 UTF-8 的支持较差,而 PowerShell 对 UTF-8 的兼容性更好。可以让 CLion 默认使用 PowerShell 作为终端:</p>
<ol>
<li>打开 CLion 设置:<code>File → Settings → Tools → Terminal</code>。</li>
<li>在 <code>Shell path</code> 中,将默认的 <code>cmd.exe</code> 改为 PowerShell 路径(通常是 <code>C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe</code>)。</li>
<li>重启 CLion 后,运行程序时会使用 PowerShell 终端。如果已按方案 1 开启系统 UTF-8 支持,PowerShell 会默认正确显示中文。</li>
</ol>
<h4 id="总结-1">总结</h4>
<p>问题根源是 <strong>Windows 控制台默认编码(GBK)与程序输出编码(UTF-8)不匹配</strong>。<code>SetConsoleOutputCP(65001)</code> 是手动“临时适配”的方法,而通过 <strong>方案 1(系统级 UTF-8 配置)</strong> 可以一劳永逸解决,推荐优先尝试。如果担心系统级设置影响其他程序,可选择 <strong>方案 2(项目级自动初始化)</strong>,无需每次手动写代码。</p>
<h2 id="ps解决方案由豆包提供有误请指正">p.s.解决方案由豆包提供,有误请指正</h2><br><br>
来源:https://www.cnblogs.com/greyham/p/19125286
頁:
[1]