
先交代一个前提我写这篇不是为了复述网上那些“把编码改成UTF-8就行”的笼统说法而是想把CLion里中文乱码这件事拆到根上。中文乱码在CLion里是个高频问题尤其是Windows用户第一次用MinGW跑出“锟斤拷”“缁撴灉”的时候几乎以为自己电脑坏了。其实只要理解了“源码保存编码、编译器生成编码、程序输出编码、控制台解码编码”这四段链路所有乱码都能在不重装、不换IDE的前提下解决。这篇东西适合刚入手CLion的新手也适合被老项目GBK文件折磨的长期用户我会把每个方案背后为什么有效讲清楚而不是只给步骤。1. 中文乱码到底卡在哪一环1.1 一段中文从源码到屏幕要经过四个关卡很多人第一次遇到CLion中文乱码时第一反应是去改某个设置改了一通还是乱。这是因为乱码不是一个点的问题而是一条链路的问题。一段中文要出现在屏幕上至少要经过四个关卡第一关是源码文件本身怎么保存字符第二关是编译器按什么规则读取源码并写入到可执行文件第三关是程序运行时printf或者cout把这些字符以什么字节序列吐出来第四关是显示端CLion的Run窗口、Windows的cmd、Windows Terminal等按什么代码页去解码这些字节。这四个关卡各自独立又相互关联任何一个环节的“编码约定”跟旁边不一致乱码就来了。用一个生活化的类比有四个人接力传一句话第一个人用拼音记第二个人按拼音读出来再用自己的方言写一遍第三个人又按自己的理解转译第四个人再念出来。只要中间任何一个人理解的规则跟上下家不一致最后听到的肯定不是原来那句话。中文乱码的本质就是这样——不是“数据丢了”而是“同一个字节被不同人用不同解码方式解读了”。具体到CLion这个场景最典型的组合是源码文件是UTF-8编码GCC编译器默认以UTF-8解释源码并把字符串原样放进可执行文件程序输出的是UTF-8字节流但Windows的cmd默认代码页是936GBKCLion的Run窗口如果没特别配置也可能走系统默认的GBK解码。于是UTF-8的中文字节被GBK硬解屏幕上就出现了一堆看不懂的字符。理解了这一点后面所有解决方法都变成同一个思路——把整条链路的编码约定对齐。1.2 看乱码猜病因几种典型症状对照乱码不是随机出现的不同的乱码“长相”能告诉我们到底哪个环节错了。我自己排查时最喜欢先盯着乱码看两秒基本能猜出七八成。第一种是“锟斤拷”三件套。这个太经典了凡是看到这仨字基本可以断定程序输出的是UTF-8字节而显示端在用GBK解码。因为UTF-8的替换字符UFFFD编码成字节后是EF BF BD这几个字节在GBK里解码出来就是“锟斤拷”这类汉字。所以“锟斤拷”不是乱码的随机关联而是编码错位后的固定产物。第二种是“缁撴灉”这种“拉伸感”乱码。比如“结果”两个汉字在UTF-8里是E7 BB 93 E6 9E 9C这六个字节被GBK按每两个字节一组解码就变成了“缁撴灉”。看到这种像偏旁部首被拆开的乱码也是典型的UTF-8输出对上了GBK解码。第三种是源码层面就乱了。如果CLion里打开一个GBK编码的源文件但IDE按UTF-8解码看到的会是菱形问号或者一列列乱码字符甚至在编译时还会出现类似“narrow string literal is not valid UTF-8”的警告。这种情况就不是运行期的问题而是文件本身在编辑器里已经读错了。还有一种特殊情况程序在CLion的Run窗口里乱码但同一个exe拿到cmd里双击运行却正常。这说明程序输出字节本身没问题问题出在CLion的Run窗口解码方式和你的程序输出不匹配。搞清楚这些对应关系就不会再像无头苍蝇一样乱试了。1.3 先定大方向统一UTF-8还是顺应GBK解决中文乱码只有两个大方向不存在第三条路要么让所有环节都用UTF-8要么让所有环节都回到Windows原生的GBK体系。最怕的就是一会儿改这里一会儿改那里最后各个环节一半UTF-8一半GBK越改越乱。我的建议很明确新项目、个人项目、团队没有历史包袱的项目一律走“全链路UTF-8”。原因很简单UTF-8是当前跨平台的主流编码Linux和macOS下CLion默认就是UTF-8CMake、Git、现代编辑器的默认值都向UTF-8看齐。Windows下只要把控制台代码页切到65001UTF-8就能正常工作。顺应GBK只适合一种情况你在维护老项目源文件全是GBK依赖的库也按GBK输出这时候强行转UTF-8反而会引发一堆连锁问题不如让全员GBK等将来某一天统一迁移。选定方向之后下面所有配置都围绕这个方向展开。接下来我会先讲推荐的全链路UTF-8方案再讲一套代码级兜底方案最后讲CMake工程里怎么把这些配置固化下来。2. 方案一全链路统一UTF-8现代推荐做法2.1 第一步把CLion和源文件全部设成UTF-8全链路UTF-8的第一步是让CLion本身使用UTF-8作为全局编码。打开Settings设置进入Editor下面的File Encodings页面你会看到Global Encoding、Project Encoding、Default encoding for properties files这三项全部改成UTF-8。别看这个页面不起眼很多人乱码半天找不到原因就是因为CLion的Project Encoding还停在系统默认的GBK上导致新创建的文件以GBK存储。接下来检查已有源文件的编码。CLion窗口右下角会显示当前文件的编码如果显示GBK或者其他非UTF-8编码点击它选择“Convert to UTF-8”转换成UTF-8。注意是Convert不是ReloadReload只是换一种方式读取文件在磁盘上的字节不会变Convert才会真正改写文件内容。这一步要养成习惯尤其是从老项目里拷过来的.cpp文件十有八九是GBK的。转换完成后在CLion里看起来没有任何变化是正常的因为IDE本来就能自动猜编码显示真正的区别在编译产物和团队协作时的文件一致性上。这里我要插一句很多教程只让你改这两个编码设置然后告诉你“改完就好了”其实不一定。因为源码编码只决定了第一步后面编译器、运行窗口、控制台代码页的编码没跟上照样乱。所以别急着去运行继续往下配置。2.2 第二步让编译器把中文字符串以UTF-8写进可执行文件源码是UTF-8了接下来编译器必须正确理解它并且在生成可执行文件时把中文字符串也以UTF-8编码写入。这一步跟你用的工具链有关如果CLion配的是MinGW的GCC那么好消息是GCC默认就假设源文件是UTF-8并且默认以UTF-8作为执行字符集所以全链路UTF-8下GCC基本不用动。但如果你的CLion配的是Visual Studio的MSVC工具链情况就不一样了。MSVC默认会把无BOM的UTF-8源文件按系统的ANSI代码页去读也就是按GBK读UTF-8字节这会导致中文字符串在编译阶段就已经被破坏运行时输出的字节根本不是你想打印的内容。MSVC的解决办法是给编译器加/utf-8参数这个参数等价于同时指定/source-charset:utf-8和/execution-charset:utf-8告诉MSVC“源码按UTF-8读生成的可执行文件字符串也按UTF-8写”。在CMake工程里可以这样集中设置if(MSVC) add_compile_options(/utf-8) elseif(MINGW OR CMAKE_C_COMPILER_ID STREQUAL GNU) add_compile_options(-finput-charsetUTF-8 -fexec-charsetUTF-8) endif()这个写法同时覆盖了两种工具链。GCC分支里我加上-finput-charsetUTF-8 -fexec-charsetUTF-8虽然GCC默认就是UTF-8但显式写出来有个好处团队里如果有人把源文件另存成了GBK编译时GCC会因为这行参数要么明确报错要么明确转码而不是悄悄产生乱码。编译选项是给人看的约定代码注释写一百遍不如一行编译参数管用。2.3 第三步让CLion Run窗口和Windows控制台都认识UTF-8这一关卡住了最多人。很多开发者的程序输出确实是UTF-8字节但CLion的Run窗口没有按UTF-8解码于是屏幕上依旧乱成一团。CLion的Run窗口和系统cmd不是同一个东西它接收的是程序标准输出然后由IDE自己决定按什么编码解码显示。这个“IDE自己决定”的解码规则在Windows上没有统一默认经常就跟GBK走了。解决办法有两个可以组合使用。第一个办法是在CLion的虚拟内存参数里强制指定编码打开Help菜单选择Edit Custom VM Options在打开的配置文件末尾加上一行-Dfile.encodingUTF-8 -Dconsole.encodingUTF-8保存后重启CLion。这个操作会同时影响IDE内部对文件内容的处理和Run窗口对控制台输出的解码。第二个办法是如果你不想动VM Options也可以打开Settings搜索Console相关配置看看是否有Console encoding的下拉选项有就手动改成UTF-8。不同版本的CLion菜单位置略有差异找不到就直接用第一个办法一个参数顶过去乱试十几次。至于Windows下的cmd和Windows Terminal如果你需要在CLion之外直接双击运行exe那还得让控制台代码页切到65001。临时验证可以直接在cmd里敲chcp 65001再运行程序立刻就能看出区别。长期使用可以写个批处理或者在代码里调用Windows API下一节细说。Windows Terminal比较新默认就用UTF-8所以如果你平时在Windows Terminal里跑程序体验会比老cmd好很多。2.4 完整实操示例新装CLion MinGW从零配好为了不让前面几个小节变成零散的知识点我直接演示一遍新装CLion MinGW环境下让“printf中文乱码”彻底消失的完整过程。假设你刚装好CLion、刚配好MinGW工具链新建了一个C项目main.cpp里写着#include cstdio int main() { printf(你好中文乱码再见\n); return 0; }第一次运行大概率看到“浣犲ソ涓枃涔辩爜锛屽啀瑙”这种完全没法看的东西。别慌按顺序做四件事。第一确认源文件编码。看CLion右下角如果显示UTF-8跳过如果显示GBK点开选择Convert to UTF-8。第二在CMakeLists.txt里加上前面那段区分MSVC和GCC的编译选项。第三Help - Edit Custom VM Options加-Dfile.encodingUTF-8和-Dconsole.encodingUTF-8重启CLion。第四如果重启后还是乱再在main函数最前面加一行Windows API调用#include windows.h int main() { SetConsoleOutputCP(CP_UTF8); printf(你好中文乱码再见\n); return 0; }SetConsoleOutputCP(CP_UTF8)意思是“当前进程的控制台输出代码页设为UTF-8”。我们后一节会细讲它的作用边界这里先按下不表。完成这四步后再次运行中文就该正常显示了。如果还是乱请直接跳到第五节的排查技巧不要再乱猜了。3. 方案二程序主动设置输出代码页代码级兜底3.1 SetConsoleOutputCP到底是干什么的很多网上教程把SetConsoleOutputCP(CP_UTF8)说得神乎其神好像加了这行代码一切乱码都自动解决。其实它做的事情非常具体它是Windows提供的一个API作用是告诉当前进程所关联的Windows控制台“我接下来输出的字节流请你按UTF-8来解码显示。”它只影响进程所在的那个控制台窗口不改变printf的字节内容也不做任何字符转码。这意味着两件事。第一如果你把程序从CLion的Run窗口挪到cmd里双击运行只要加了这行cmd里的输出就会正常因为cmd就是Windows控制台的典型代表。第二如果你在CLion的Run窗口里运行这行代码很可能不生效——因为CLion的Run窗口不是Windows控制台它是IDE自己画的一个输出面板直接接管程序的stdout字节然后按IDE内部设置解码。所以我在上一节的实操演示里把SetConsoleOutputCP放在第四步意思是它是给真实cmd场景的一个兜底CLion侧的问题还是要靠CLion自己的编码配置来解决。这里我必须强调的是不要在代码里写一堆跨平台的判断逻辑来调用SetConsoleOutputCP比如只在#ifdef _WIN32下调用这是对的但也不要指望它解决CLion Run窗口的乱码否则你会调试到怀疑人生。正确的心态是把SetConsoleOutputCP当成程序对运行环境的“宣告”宣告我的输出是UTF-8而不是当作万能修复器。3.2 setlocale与C/C标准库的微妙关系如果你只用printf输出窄字符串setlocale可能影响不大但一旦用了wprintf、wcout或者涉及到宽字符向多字节字符的转换setlocale就成了决定乱不乱的关键因素。Windows的C运行时库在把宽字符输出到标准输出时必须知道“用什么编码去编码这些宽字符”而这个编码规则就来自当前locale。一个典型例子在Windows下运行wprintf(L你好)如果不调用setlocale输出的往往是问号或者乱码。加上这一行#include clocale setlocale(LC_ALL, .UTF-8);然后再用wprintf输出宽字符就能正常显示。注意这个字符串是“点号加UTF-8”在Windows CRT里表示“使用操作系统的区域设置但编码用UTF-8”。如果你更喜欢用GBK体系可以换成.936效果就是让宽字符按GBK编码输出。CLion的MinGW环境对locale的支持比MSVC略复杂但.UTF-8这个写法基本都是可用的。通常情况下我的建议是纯C/C控制台程序打印中文优先用UTF-8窄字符串不要夹杂宽字体如果你确实需要wprintf那就必须配合setlocale并且在CLion的VM Options和真机cmd的代码页上都保持UTF-8三者缺一不可。3.3 用WinAPI输出中文时为什么还会另类乱码还有一个很容易混淆的场景程序里调用MessageBoxA或者WriteConsoleA这类WinAPI函数传入中文字符串结果弹窗或输出乱码。这个跟控制台代码页已经没关系了而是WinAPI对窄字符串的约定问题。Windows的ANSI函数默认按系统ANSI代码页简体中文系统就是GBK解释传入的字符串所以如果你传入UTF-8字节它就会按GBK去解码自然乱码。这时的正确做法不是再去SetConsoleOutputCP而是用宽字符版API。比如MessageBoxW配合宽字符串MessageBoxW(nullptr, L你好, L提示, MB_OK);或者先用MultiByteToWideChar把UTF-8窄字符串转成UTF-16宽字符串再把宽字符串传给W系列API。这个知识点放到乱码主题下讲是因为很多人搜“中文乱码”搜到这里会跟控制台乱码混为一谈。记住一个简单判断规则如果乱码出现在CLion的Run窗口或cmd里多半是控制台解码问题如果乱码出现在弹窗、文件对话框、程序界面里多半是API接受的编码和你提供的字节不一致跟终端无关。3.4 两个方案该如何选择为了让你决策时不纠结我把两个方案放在一起做一个对比。全链路UTF-8适合几乎所有新项目它的核心理念是“所有环节都说一种语言”不用来回迁就Windows的老代码页跨平台表现也一致。顺应GBK方案适合老项目尤其是那些源文件本身就是GBK、外部依赖也按GBK输出中文、短期内又没有迁移计划的场景。对比项全链路UTF-8顺应GBK系统ANSI源文件编码UTF-8GBK编译器参数MSVC用/utf-8GCC用UTF-8系列参数默认ANSI即可或显式指定GBKCLion设置File Encodings三项设UTF-8设GBK或者跟随系统运行窗口VM Options加file.encoding和console.encoding保持系统默认代码层兜底SetConsoleOutputCP(CP_UTF8)SetConsoleOutputCP(936)跨平台特性好Linux/macOS天然兼容差仅Windows下自洽维护成本低一次配置长期收益中随时可能被混用的UTF-8文件干扰我的个人选择一向是新写的代码全部走UTF-8除非遇到完全改不动的老库否则不去碰GBK。这里也劝一句别为了“显示中文”去把Windows系统区域设置里的“Beta版使用Unicode UTF-8提供全球语言支持”开启那个开关影响的是整个系统很多老软件会因为默认代码页变成UTF-8而出现新的乱码或者兼容问题代价远大于CLion这一个软件的收益。4. CMake工程里的隐蔽配置与跨平台细节4.1 在CMakeLists.txt里统一编译选项是最划算的事前面配置文件编码和VM Options解决的是你本机的问题。但工程是多人协作的你不可能跑到每个同事的CLion里去帮他们点Settings。所以把编译器编码参数写进CMakeLists.txt是性价比最高的做法它保证任何人在任何机器上clone下来编译出的可执行文件都遵守同样的编码规则。推荐的做法是单独封装一个函数或者宏不要在主CMakeLists.txt里堆一堆if。简单起见下面这个写法可以直接用if(MSVC) add_compile_options(/utf-8) elseif(MINGW OR (CMAKE_C_COMPILER_ID MATCHES GNU)) add_compile_options(-finput-charsetUTF-8 -fexec-charsetUTF-8) endif()这里有个细节值得说。MSVC的/utf-8同时管了“源码怎么读”和“执行字符集怎么存”而GCC的-finput-charset和-fexec-charset是分开的。前者管“源文件是什么编码”后者管“可执行文件里的中文字符串用什么编码存放”。如果你手里有一批GBK老源文件又暂时不想转换它们可以在GCC分支里把-finput-charset改成GBK而-fexec-charset保持UTF-8这样源码是GBK、运行输出是UTF-8一样能把终端乱码压下去。MSVC则可以通过/source-charset:gbk /execution-charset:utf-8达到类似效果。这个灵活性在迁移老项目时特别有用。4.2 运行配置里的环境变量也别忽略CMake管的是编译期运行期还得看程序运行环境。CLion的Run/Debug Configurations里有一个Environment variables栏目支持给程序设置环境变量。很多人在这个地方配置过LANGzh_CN.UTF-8或者LANGC.UTF-8。这个变量在某些场景下比编译器参数更直接它会影响C标准库的locale初始化进而影响宽字符转换、strftime这类按locale格式化输出的函数。比如程序里用了std::wcout L你好如果环境变量里没有合适的LANGWindows CRT可能默认使用经典的C locale也就是“只认识ASCII”宽字符输出自然变成乱码。在运行配置里加上合适的LANG变量就像在启动程序前先替它布置好了语言环境。不过要注意这个变量对printf输出窄字符串的影响很小因为窄字符串本来就是字节流printf只是把字符数组的字节原样写到stdout编码已经固化在编译产物里了。这也是我经常看到有人混用环境变量和编译器参数的原因——他们其实是没搞清楚自己程序的乱码发生在哪个类型上。4.3 MSVC与GCC的差异对照别再背错参数CLion支持多种工具链最常见的坑就是用户按MinGW的教程给MSVC配了-fexec-charset结果MSVC报错不认。这两种编译器的编码参数命名完全不同我来给一个速查对照。用途MSVCGCC/Clang源码按UTF-8读取/source-charset:utf-8-finput-charsetUTF-8可执行文件字符串按UTF-8存储/execution-charset:utf-8-fexec-charsetUTF-8两者一起设置/utf-8同两行参数或默认MSVC还有一个老生常谈的坑是C4819警告这个警告出现时通常会伴随源文件中的中文字符在某些系统代码页下被错误读取。虽然C4819本身只是警告但它往往会跟乱码问题同时出现属于一个烟雾弹。看到这个警告第一反应应该是检查源文件编码和编译器参数而不是去关警告。GCC这边则会给出“invalid UTF-8”之类的提示同样也是在提醒你源码编码和-finput-charset对不上。我见过不少人在CLion的Toolchain设置里换了编译器后忘了同步CMakeCache导致加了半天的参数根本没用上。改完工具链后最好在CMake菜单里执行一次Reload CMake Project让缓存里的编译器检测结果更新再继续调编码问题。4.4 从救火到预防EditorConfig和文件约定编码问题的终极解法是让它根本不会出现而不是天天救火。CLion支持EditorConfig你可以在项目根目录放一个.editorconfig文件root true [*] charset utf-8 end_of_line lf trim_trailing_whitespace true这个文件会被主流IDE和编辑器自动识别它起到的作用是任何人在这个项目里打开文件、创建新文件时编辑器都默认使用UTF-8保存能拦下一大批因为“本机编辑器默认GBK”而埋下的隐患。CLion对EditorConfig的支持很成熟保存文件时会自动把新文件按配置的charset落盘老文件如果编码不符合CLion也会提示你转换。文件层面的约定同样重要。如果团队里混用了GBK和UTF-8的源文件就算编译参数调得再好代码评审也会被文件编码差异搞疯。一个实用的做法是规定“所有源文件一律UTF-8无BOM”并且用CLion的Settings里File Encodings页面把Default encoding for properties files也改成UTF-8防止.properties或者CMakeLists里的注释因为编码问题变成乱码。CMakeLists.txt里的中文注释乱掉虽然不影响编译但特别影响协作心情。5. 常见乱码场景与排查技巧实录5.1 现象速查表五种典型场景一眼定位我把日常工作中遇到最多的乱码场景整理成一张速查表你可以直接按图索骥不用每次都从头推理。场景典型表现主要病因首选解决方向CLion Run窗口和cmd都乱码锟斤拷、缁撴灉程序输出UTF-8控制台按GBK解码统一UTF-8配置必要时SetConsoleOutputCP只有CLion乱码cmd正常Run窗口中文错乱exe正常CLion控制台解码编码与程序输出不一致VM Options加console.encodingUTF-8只有cmd乱码CLion正常CLion里正常双击exe乱码程序输出GBKcmd按UTF-8或反之检查程序实际输出编码改对应代码页源码在CLion里显示乱码菱形问号、乱码字形文件编码与IDE解码不匹配Convert to UTF-8或手动指定文件编码编译告警伴随乱码C4819、invalid UTF-8源码编码与编译器预期不符转换文件编码或加编译器参数这个表里的第二和第三行特别容易搞反。很多人在CLion里把VM Options改了又改结果程序拿到外部cmd一跑是正常的这时候就说明CLion侧才是问题所在别再去折腾cmd了。反过来如果CLion正常但cmd乱说明CLion配置歪打正着地匹配了程序输出而cmd的代码页和exe输出不一致这个要改的是cmd代码页或者程序输出编码。5.2 定位乱码源的“输出重定向”法如果上述速查表还是没让你定位到具体环节那就用最笨也最可靠的办法让程序的输出不经过任何终端解码直接写到文件里然后再去看文件内容。在CLion的Run窗口里你可以在运行配置的Program arguments里加一个重定向吗不行CLion的Run配置不直接支持shell重定向。最简单的办法是临时在代码里加一行freopen(output.bin, wb, stdout);或者直接在你的CMake构建目录下手动执行./your_program output.bin然后打开output.bin用VS Code或者Notepad分别按UTF-8和GBK解码看看。哪一种解码方式显示的中文正常就说明程序输出的字节是那种编码。这一步能把“程序输出字节”和“显示端解码”彻底拆开接下来的方向就非常明确了如果文件按UTF-8正常而CLion乱码就去改CLion的console编码如果文件按GBK正常而CLion乱码那就去把程序输出改成UTF-8或者反过来让CLion按GBK显示。我遇到过一个很典型的案例同事说CLion里printf中文乱码我让他重定向到文件一查文件里按UTF-8解码完全正常然后我再看他的CLion配置发现他之前把文件编码全改成了GBK程序里又没加任何编译参数MinGW按UTF-8编译输出自然是UTF-8CLion按GBK显示乱。整个排查时间不超过五分钟但比他瞎改两天强多了。5.3 几个容易忽视的小细节排查乱码时有几个细节特别容易坑人。第一是CLion的Run窗口和内置Terminal工具窗不是一回事Run窗口显示的是程序stdout而Terminal工具窗是真实的shell代码页跟随你配置的shell程序。很多人把这两者搞混在Run窗口乱码时去Terminal里chcp当然没用。第二是Windows Terminal和传统cmd的默认代码页不同Windows Terminal是支持UTF-8的新终端所以同样一个exe在cmd里乱码在Windows Terminal里可能正常——这正是“换个环境就好了”的迷惑性所在。第三是编码设置有“记忆性”。你给A项目改了VM Options或者文件编码B项目并不会自动同步。尤其是CLion的File Encodings页面Global Encoding、Project Encoding、Properties Files三项分别影响不同内容只改Global不改Project老项目该乱还是乱。第四是BOM问题。UTF-8带BOM的文件能让MSVC正确识别源码编码但对GCC反而可能产生编译问题统一UTF-8无BOM后就不需要靠BOM去猜了。第五如果程序里同时用了printf和std::cout由于C和C标准库的缓冲机制不同可能出现输出顺序乱掉的情况这时候别把它当成乱码去调编码会越调越远。5.4 我的一点实操心得最后说说我现在的工作习惯。每次新建CLion项目我第一件事不是写代码而是先把CMakeLists里的编码参数加上再开EditorConfig确认一下右下角文件编码是UTF-8。这套动作花不了一分钟但能省下后面无数个“为什么中文又乱了”的糟糕体验。实际跑程序时我默认CLion Run窗口就按UTF-8显示如果遇到乱码我第一反应永远是“先确认程序实际输出字节再确认CLion解码规则”绝对不会一上来就改系统区域设置。踩过几次坑之后我对中文乱码的态度已经从“怎么又乱了”变成“让我看看是哪个环节不一致”。编码这个东西本质上就是一套双方约定只要把约定对齐剩下的都是体力活。希望这篇内容能让你少走我当年走过的弯路哪怕只帮你省下十分钟也值了。