idea中文编码问题分析(一)

1,013 阅读4分钟

今天测试spring boot应用时,遇到了idea中文乱码问题,趁此机会了解一下idea中编码的一些默认规则。

字符集和字符编码

首先要了解字符集和字符编码的区别(文章中有一点不太对,gbk称为字符编码更合适一些)。知道unicode是字符集,utf-8,gbk是字符编码后,有些问题就很好理解了。

idea配置文件的编码设置

    图中1处可以设置配置文件的编码方式,这里设置后,当你输入中文时,会按utf-8的编码方式在文件中存储(中文的utf-8编码一个字是三个字节表示,比如“信息”的utf-8编码是E4BFA1 E681AF,存储在文件中每个也是占三个字节);如果设置为gbk,则按照gbk的编码方式在文件中存储(“信息”的gbk编码是D0C5 CFA2,存储在文件中每个占两字节)。

    而2处的这个设置勾选后,则会将保存方式统一修改为unicode编码(比如“信息”的unicode编码是4FE1 606F,保存的时候就是\u4FE1\u606F,每个字占6个字节,因为unicode编码的每个字节可能和标点,拉丁字母等的unicode码是一样的,为了识别,在前面加上\u前缀)。

    而java源文件中的中文,默认按照utf-8的方式,在内存中被直接识别为unicode码,如上图所示;保存在文件中时,则根据你设置的文件的编码方式保存(utf-8就保存为3字节,gbk就保存为2字节)。

要查看文件的二进制编码,可以使用winhex

乱码原因

了解了idea中编码方面的一些设置规则后,就可以很快分析乱码的原因了。

配置文件乱码

    上图中,如果我们把2处的打勾取消掉,那1处不管设置为utf-8还是gbk,最终读取的properties文件中的中文都会乱码,为什么呢?原因在于idea默认读取配置文件都是按照unicode码来读取。(比如“信息”的utf-8编码是E4BFA1 E681AF,按unicode方式识别的时候每个字节都被识别成了一个unicode码,这样就变成了6个unicode字符)(先按某种编码方式识别,再转换为Unicode?)所以配置文件中,要正确识别中文,需要把2勾选上,还要记得修改下文件,这个配置才会生效。

    这里有一个未弄明白的问题(斜粗体)就是读配置文件时,idea是先按utf-8编码识别一次,再转换成unicode码,这里识别的编码方式能否更改?(这点通过设置成gbk编码可以验证,gbk编码也会按utf-8识别一次)或者说从配置文件到读入内存,整个转换过程还未完全了解,希望了解的大牛能指导下。

源文件中文乱码

    源文件的中文乱码原因很简单,就是源文件的中文按一种编码方式编码,解析时使用了另一种编码方式解析,多发生在导入别人的工程时。比如别人的工程时gbk编码的,你导入的时候按utf-8编码,那毫无疑问会乱码。至于如何修改网上教程很多,比如这篇

   这里也有一个未解决的问题,因为源文件的中文默认按utf-8识别后转换成unicode码放入内存,如果是GBK编码的中文,就会出现识别错误的问题(已实际验证过),能否把这里的识别方式修改为gbk?

总结

    idea的乱码问题主要是文件读取时编码方式和保存的时候的编码方式不一致引起的,所以了解idea各项编码配置的实际作用很关键,这样才能又快又好的去解决问题。目前来看idea还有许多其他编码的配置,还需要继续深入去了解。