文章目录
关于这个控制台乱码问题, 最初我都是随便配置了一些编码, 只要使日志正常显示之后就不再管它了, 但是最近遇到了各种奇葩的乱码问题, 尤其是帮别的项目或帮同事处理代码问题的时候, 乱码问题真的是五花八门, 群魔乱舞, 于是我抽了个周末好好研究了下乱码这个问题, 在此做下记录, 方便大家处理乱码问题
本篇研究以Java为代码, 集成开发环境为IDE, 操作系统为 window10
简单分析可能造成乱码的原因
首先我们要知道什么是乱码, 简而言之乱码就是文件打开的编码方式和文件本身编码方式不对, 注意这个地方有两个编码, 一个是文件本身的编码, 一个是用什么编码打开文件, 两个编码不对应, 就会出现乱码.
例如以下图片(控制台乱码)
关于这个
淇℃伅
, 我可以明确告诉你们这个是UTF-8编码信息
, 那为什么会显示成淇℃伅
呢, 是因为控制台以 GBK的方式显示UTF-8编码.
深入分析乱码原理
1. 首先让我们列举下我们可能用到的编码有哪些
编码 | 解释 |
---|---|
GBK | 汉字内码扩展规范, 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,window中国区默认编码 |
UTF-8 | 针对Unicode的一种可变长度字符编码。兼容于ASCII编码, 国际比较通用的编码格式 |
- 在一些编译器里面也许有 ANSI 这种编码, 但实际上 ANSI 并不是特指某一种具体的编码, 这里以window为例, 假如你window电脑的区域和语言是中国, 那么“ANSI编码”实际是GBK编码。当你把它改成Korean(Korea)时,“ANSI编码”实际是EUC-KR编码,当你把它改成English(US)时,“ANSI编码”实际是ASCII编码.
- UTF-16 是JDK String 的存储编码, 但一般来说, 你只要不对char数组进行bit解析, 至少你在日志中一般不会碰到UTF-16的情况.
- 综上分析, 我们只需要研究下
GBK
和UTF-8
两种编码格式即可.
2. 其次让我们分析下JAVA IDEA开发中涉及到的编码配置可能有哪些
列举所有可能出现的情况大概就以下几种, 先别管对不对, 只要可能的就先列举上
1. java 源文件编码.
2. java编译成的class文件编码.
3. jvm 以什么编码格式运行class文件.
4. jvm 以什么方式输出日志
5. 控制台以什么编码格式显示输出日志.
6. 系统默认编码
7. log 日志输出编码(log4j, log4j2, logback).
接下来让我们通过问答的方式大家明白几个解释起来比较散乱的常识
Q1: java 源代码会对乱码有影响吗
A: 源文件编码格式对乱码没什么影响
事实上不管你 java 源代码用的是什么编码格式, 编译成的 class 文件都是一样的, 而class文件编码貌似只有一种, 盲猜应该是UTF-16
.
下面是我将内容同样而编码格式不同的两份源码编译成的两个class文件属性图, 通过文件算码发现两个class文件完全一致.