提示:嫌麻烦的直接跳过第一项即可!但第二和第三项一定要连着看!
1.Project Encodings 和 Global Encoding的作用
首先从官方文档里面了解到,是这样描述Global Encoding的:
意思是:如果遇到不属于项目的文件(即你单独打开一个Java文件而没有New Project)或者从版本系统中检出源码的时候,没有明确指定编码,这两种情况下会选择Global Encoding的编码格式来进行,而不是所谓的英文理解上的应用于全部项目的编码格式
翻译过来是:对于表格中未明确指定编码的文件,您需要选择一个合适的编码方式来确保这些文件可以被正确地读取或写入。
听着很难懂,说人话就是,例如你的同学李华用的是GBK编码,而你用的是UTF-8的编码,那么你打开他的文件的时候,就会发生编码错误提示,因为你使用的是UTF-8,此刻GBK就是没有列出在表格的编码格式(即 not listed in the table below),除此之外,Project Encodings也是你新建一个项目时文件使用的默认编码,接下来我会详细说明。
2.(直接解决方案)Global Encoding、Project Encodings 和 右下加的File Encoding的关系
首先要明确,Global Encoding是和Project Encoding控制着不同的东西(至于是控制着生成的什么文件我也不清楚,但通过试验可以得出),而我们所经常迷惑的右下角的File Encoding,就是这个小东西:
它起始就是你新建一个文件时的选择的Global Encoding的编码格式,如果你新建一个项目时Global Encoding和Project Encoding不同,就会在控制台发生乱码现象,而编辑器的中文是正常的
IDEA分为三种编码等级:
右下角的File Encoding是最高优先级,代表着当前文件文本的编码格式
Settings设置中的Project Encodings和Global Encodings处于同一优先级,并且都弱于File Encoding
所以一旦用File Encoding改变编码格式后,就不受Project Encodings和Global Encodings约束了。而之所以新建一个文件时File Encoding和Global Encodings保持一致,是因为为了减少使用者在创建多个项目的时候,多次更改Global Encodings而导致多个项目编码混乱的情况,而Project Encodings在新建项目时使用默认值是为了确保有一个干净的、未被先前项目配置影响的编码环境。
小段总结:
1.Global Encodings和右下角的File Encoding在新建项目时默认一样的,这是IDEA让全局化避免出错的一种体现,而File Encoding类似于控制着当前文件文本的读取编码和控制台输出编码格式
2.Project Encodings和File Encoding之间是不同的,好像控制着不同地方的编码格式输出,而如果不在File Encoding上改动的话,需要保持Project Encodings和其一致,需要改动Project Encodings
3.改动File Encoding之后,即使用右下角的File Encoding convert转换之后,整个项目的文件文本就只受到File Encoding的控制,和Project Encodings无关了
可以看出来此时右下角的File Encoding和Global Encodings是一样的
那么怎么纠正呢?有两种方法:
(1)不改变Global Encodings 或 右下角的File Encoding,那么只需要你将Project Encodings改为和右下角的File Encoding(即Global Encodings)相同就可以了
、
如此乱码正常了。
(2)第二种方法就是将你的右下角的File Encoding(记住是右下角的,不是设置中的Global Encodings),选择和你的Project Encodings相同的编码,之后
选择Convert(不是Reload),选择Reload是没有用的。
1.Reload是对你的编辑器中的代码编码进行重新加载编码格式,对生成的解释文件的编码格式是没有改变的,只转换文件编码格式
2.而Convert是对你的文本、文件的编码格式都进行转换
注意,当你对你的项目进行过Convert之后,你的项目的编码格式和你Settings设置中的Project Encodings和Global Encodings就没有约束关系了,它就是它,现在只跟右下角的File Encoding有关系
3.Convert 和 Reload 的区别
下面就要说到Reload和Convert的详细操作了,相信不少同学都是在这一乱按导致编码格式无法调整回去了,首先承接上面的我们知道,现在更改过Convert一次编码格式后,就只需要对右下角的FIle Encoding进行操作就行了,现在我使用的是GBK编码,那么我Reload一次看看:
由 GBK Reload 为UTF-8的结果:
变为UTF-8的编码后,发现编辑器的文件发生乱码了,并且上面还给出了错误提示:文件在一个错误的编码格式 UTF-8 中加载,说明我们仅是改变了文件的代码编码格式,运行一下,会发现乱码
说明我们的文本格式还是GBK,而文件编码却是UTF-8,但如果我想要变为UTF-8编码而不想使用GBK编码怎么办呢?那就要使用Convert了
我们先重复上述操作,将文件编码调整回GBK,再选择convert
会发现编辑代码没有乱码,并且控制台输出也没有乱码,完美!
3.特别注意
在上一项操作中,我 Convert 到 UTF-8 之前要先保证此时的编码是正确的没有错误提示的(你要 Reload 到原来的编码格式之后,再Convert才行)即编辑器中的文件没有乱码,如下图:
只要没有上一行这样的提示或者乱码,我们就可以随心所欲的convert,但如果有这样的提示,你再convert的话,会发出警告
提示你想要的convert的编码格式无法识别文件(即编辑器中)的编码,如果还要继续,你会发现你之后无论再怎么convert编辑器和控制台都是乱码,因为此时你无论怎么转换编辑器中的乱码都不会消失,所以控制台输出的自然也是乱码,你就只能手动将乱码删除改为之前的中文了。