Skip to content Skip to footer

win11系统解决一切文件(无论txt或exe)运行时中文输出乱码问题

首先我们要知道为什么中文乱码会出现,以及为什么英文不会出现乱码。

本质是中文的编码有两大体系,ansi和utf-8。而这两种编码的英文编码都是一样的,因此不会出现英文乱码。然而,这两种编码的中文编码却不一样,如果你用ansi的解释器解释utf-8的编码,那百分之百会出现乱码!

一切的文件乱码问题,都可以归结为以下的两种情况。

情况1:同一个文件含有两种编码方式。

系统识别一个文件,只能选择一种语言解释器,不是ansi就是utf-8,如果你的文件既含有ansi编码的中文,又含有utf-8编码的中文,那恭喜你,你将见证如下戏剧性的结果:系统选择了ansi解释器,那你的ut-8就会乱码;系统选择了utf-8解释器,那你的ansi就会乱码。无论怎么选,都会有一个乱码。(这是最常见的乱码情况,只要尝试改成另一种编码方式就能修正乱码了)

上面两张图出自同一个文件,上半部分是UTF-8编码,下半部分是ansi编码,想让两种编码都统一,无论选哪种解释器都不行,真的很讨厌。

有人产生疑问,我怎么可能蠢到一个文件用两种编码方式?如果是手动操作,比如手写txt文件,那确实不会。因此对于txt或类似的文本文件,出现的原因就是系统使用了指定的解释器,跟你的编码方式相反,只要改成一样的就行了。可是你的exe文件怎么办,exe能手写吗?在编译的时候是相当有可能同时使用两种编码的,经典的案例就是C语言的read和scanf读取内容的编码类型不一致。一个读向的是文件,一个读向控制台,比如你read的文件是utf-8编码的,则write时也会输出utf-8编码的中文;而你的scanf读向的命令行通常是ansi编码的中文,那write的必然也是ansi编码。可怜的exe文件只能被迫默默承承担这一切,两件衣服各穿一半。更可怜的是不知情的程序员,网上查找一堆资料,什么setConsole一大堆,setLanguage一大堆,妄想统一编码方式,结果发现还是没用,就问崩不崩。

情况2:文件虽然只用一种编码方式,但是系统只能使用utf-8解释器。

这个情况的结果也很明显,如果你的文件是utf-8编码,那完全没什么问题;如果文件是ansi编码,那百分之百有问题!(当然如果没中文,那问题也看不出来)

这种情况普遍出现于exe文件,因为文本文件完全可以通过修改编码方式解决。

就拿上面的文件来说,使用文本编辑器notepad++,你可以保留utf-8的部分,然后将ansi编码复制,然后到utf-8解释器下粘贴,那编码方式就是utf-8了。

总之只要你想,将txt文件统一成解释器的编码方式,或者改成任意编码方式都是很简单的。

而exe文件不同,修改编码方式将会破坏程序,损坏文件,造成不可逆的结果。换句话说,用ansi编码的exe文件,只能用ansi解释器;用utf-8编码文件,也只能用utf-8的解释器。你只能选择解释器,而不能选择编码方式。

有人又产生疑问了,那我以后只用utf-8编码不就行了吗。你说的有道理,但是网络文件千千万,你只能保证你自己操作过的文件是utf-8编码,可是要想使用别人的程序,ansi编码的大有人在,吾爱破解大部分神级软件都是ansi编码,特别是汉化版更是如此,你敢保证一辈子都不用吗?

解决:

好了,口水话说这么多,分析原理终究是纸上功夫,更重要的是如何解决。

对于情况1,问题在于如何统一read读取的文件和控制台scanf输入的编码方式统一(如果你真遇到,你会发现txt的差异只是小问题,更麻烦的是exe)。我在上面说到很多地方都推荐setConsole,setLanguage等莫名其妙的函数,具体名字我懒得再查了,我曾经也是受害者之一,可是试过之后完全没用。最好的方法就是强制设置电脑的编码只用utf-8。有人问怎么做到。

操作如下:

win+R,文本框输入intl.cpl。

在管理->更改系统区域设置勾选Beta版:使用Unicode UTF-8提供全球语言支持。之后重启电脑。你的scanf读入的控制台就会一直是utf-8编码,系统里的txt文件也会转为utf-8编码,再也不用担心跟read兼容出错了。

对于情况2,如果你真的勾选了上面的Beta选项,那请况2的问题才会出现,也就是系统只能选择utf-8解释器,ansi文件必然乱码。因为这是你勾选Beta的必然结果:“使用Unicode UTF-8”。这样就会限制你使用ansi编码的文件。怎么办呢?也很简单,取消勾选,重新启动电脑,你的系统又能自动识别编码,自动匹配解释器啦!

总结与回顾:乱码的问题我以前也遇到过,最初是PHP的乱码,然后C语言也遇到了乱码,虽然最后都解决了,但是没记录方法(其实就是情况1的问题),今天使用了OD又出现了这个问题,还真是困扰了我一会。特此写下,供诸君浏览,也是给自己浏览,下次遇到能有个解决指南吧。希望对大家有所帮助,彻底解决中文乱码的困扰。

Copyright © 2088 乒乓球世界杯几年一次_世界杯冠军 - salooo.com All Rights Reserved.
友情链接