关于这个乱码问题网上的解决方法大同小异, 但是即便你照着网上配置完之后, 也未必能够解决控制台乱码问题.

接下来由我从乱码角度来分析乱码问题, 让大家确保能够解决乱码问题.

为了节省大家时间, 直接展示下我的编码配置方案

我的编码配置原则

  1. 源码文件用于项目组之间进行版本控制, 一般用UTF-8

  2. 日志文件可能会用于在各个平台上查看, 一般用UTF-8

  3. 控制台编码对接你的电脑系统编码, 一般电脑默认是GBK

    因为我的电脑是 Window10 默认编码是 GBK, 所以我控制台配置主打 GBK

我的编码配置

  1. IDEA 中 idea64.exe.vmoptions 中的 -Dfile.encoding 和 -Dconsole.encoding 的相关配置全部去除掉, 使用系统默认 GBK 即可.


    这个使用系统默认即可, 没必要一乱码就改这个, 你的乱码往往不是这个原因.
    顺便说一下, 这个不应该是安装目录下的idea64.exe.vmoptions文件, 新版本IDEA应该是你的用户目录下(windows一般是‪C:\Users\CPF\.IntelliJIdea2019.3\config\idea64.exe.vmoptions)

  2. Run/Debug Configurations 中的 -Dfile.encoding 全部去除掉, 使用系统默认 GBK 即可.

    这个地方和上面 idea64.exe.vmoptions 配置的都是 VM 这个参数, 这个比上面那个优先级更高,和上面的原因一样, JDK 默认的已经很好了, 不需要配置这个 
    这个地方会影响到控制台 log 日志, 以及文件日志编码, 但是未必一定要配置为 UTF-8 编码, 使用默认即可, 具体原因下面会讲
    上面两步确保你的JVM参数file.encoding的值是你的默认系统编码GBK
    你可以在启动位置输出 System.out.println(System.getProperty("file.encoding")), 看下输出的字符是否是系统默认编码GBK

  3. tomcat 路径下, \conf\logging.properties配置, 注意和控制台有关的Handler:java.util.logging.ConsoleHandler.encoding 改为默认的 GBK即可, 其它和文件有关的Handler全部UTF-8

    因为一般 web 项目都是用到了 tomcat, 因此 tomcat 也需要配置, 但实际上这个配置影响的只是 tomcat 相关的 log 文件
    至于这个地方为什么网上大多都是 GBK? 请往下看, 下面有解释

  4. 正确配置 log 配置文件编码(重要)

    下面是我的 log4j2.xml 部分示例配置, 如果你用的是 log4j 或 logback 或其它, 就参照相对的 log 框架的 Appenders 配置方法

    这里我为每个Appender 配置一下输出编码, 和控制台有关的:Console:charset 改为 GBK, 其它和文件有关的RollingFile全部设置为UTF-8

    <?xml version="1.0" encoding="UTF-8"?><Configuration status="DEBUG">    <Appenders>                <Console name="Console" target="SYSTEM_OUT" follow="true">            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />                        <PatternLayout charset="GBK" pattern="%m%n" />        Console>                <RollingFile name="rolling_file" fileName="${logDir}/dust-server.log" filePattern="${logDir}/dust-server_%d{yyyy-MM-dd}.log">            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />                        <PatternLayout charset="UTF-8" pattern="%m%n" />        RollingFile>    Appenders>    <Loggers>        <Root level="all">            <AppenderRef ref="Console"/>            <AppenderRef ref="rolling_file"/>        Root>    Loggers>Configuration>
  • 终于到了我们最重要的环节, 我想说的是 99%的乱码问题都是我们 log 配置文件没有配置好导致的, 结果大家不去改 log 配置文件, 偏偏盯上 VM 配置, 和 tomcat 配置.

  • 我想告诉大家的是, 人家 IDEA, tomcat, JDK 的默认配置明明已经很好了, 我们应该去适应人家, 而不是修改人家的默认配置来适应我们五花八门的 log 配置文件,

    例如:
    A 的 log 配置的有问题, 导致 IDEA 控制台乱码了, 他修改了 IDEA, tomcat, JDK 配置, 成功强迫 IDEA, tomcat, JDK 配置适应它的他配置, 最终成功正确输出日志,
    之后 B 的 log 配置的也有问题, 日志也乱码了, 然后他参照 A 的配置配置之后, 发现乱码问题依然没有解决,

  • 要知道这个项目一个 log 配置, 那个项目一个 log 配置, 还有的 log 框架都不一样, 就算要强迫 IDEA, tomcat, JDK 适应我们的 log 配置文件, 由于我们的 log 配置文件不一样, 对应的被强迫的 IDEA, tomcat, JDK 配置也是不一样的

  • 因此为了统一配置方式, IDEA, tomcat, JDK 配置使用默认即可, 由我们的 log 配置来适应它们.

另外说一下几个重要但是和乱码无关的配置

  1. 项目配置

    这个地方挺重要的, 它控制着你整个项目 java 文件编码, 配置文件编码, 新建文件编码.但是它和你的控制台乱码是毫无关系的, 就算你将这里的编码配置改成 UTF-3.1415926, 它也管不到你的日志乱码 


可能有很多人对上面的配置不理解 请继续往下看.

乱码原因

首先我们要知道什么是乱码, 简而言之乱码就是文件打开的编码方式和文件本身编码方式不对, 注意这个地方有两个编码, 一个是文件本身的编码, 一个是用什么编码打开文件, 两个编码不对应, 就会出现乱码.

例如以下图片(控制台乱码)

关于这个 淇℃伅, 我可以明确告诉你们这个是 UTF-8 编码信息,, 那为什么会显示成淇℃伅呢, 是因为控制台以 GBK 的方式显示 UTF-8 编码.

图片中的控制台乱码中的日志一般有两种, 一个是 tomcat 输出日志到控制台, 另一个是 jvm 输出日志到控制台., 网上关于解决控制台乱码的方法大都是 修改 jvm 输出日志编码 和 tomcat 输出日志编码, 但是却忽视了一个重要的编码, 那就是 控制台是以什么编码方式显示信息的呢?.

关于这点我可以告诉你们, 一般来说, 中国电脑系统默认编码是 GBK, IDEA 控制台显示的编码也是 GBK.

现在是不是已经明白了, 也就是说控制台以 GBK 的方式打开了 tomcat 和 JVM 输出的 UTF-8 编码, 那不乱码才怪.

解决方式

既然如此, 那么解决方案就很明确了, 无非两种

  1. (不推荐)修改 IDEA 控制台显示编码为 UTF-8, 以及 tomcat, jvm 输出的日志编码也修改为 UTF-8;

  • toncat 安装路径下的 conf/logging.properties 配置文件中的 java.util.logging.ConsoleHandler.encoding 改成 UTF-8;

  • jvm 启动参数 VM options 加个配置 -Dfile.encoding=UTF-8

(推荐)直接使用 IDEA 控制台显示的 GBK 编码, 把 tomcat, jvm 输出的日志编码也全部改为 GBK;

  • toncat 安装路径下的 conf/logging.properties 配置文件中的 java.util.logging.ConsoleHandler.encoding 改成 GBK;

  • jvm 启动参数 VM options 加个配置 -Dfile.encoding=GBK.

    如果你没有加乱七八糟的配置的话, 这个 jvm -Dfile.encoding 启动参数直接置空, 就会自动使用系统默认编码 GBK

我为什么推荐控制台使用 GBK

上面解决方式中, 第二种反而是我比较推荐的一种方式, 那有人就会问了, 全部改成 UTF-8 编码不好吗?

首先看下面的我的编码对接思想.

我的编码设置思想

输出位置 编码方式 原因
源码文件 UTF-8 为了和其它同事共同开发代码, 防止出现编码问题.
日志文件 UTF-8 为了便于和其它电脑对接, 和其它系统对接, 以及文件传输
控制台 系统默认编码 GBK 仅仅在自己电脑控制台显示, 说白了, 对接本地电脑, 而且本地的 JVM 使用的实际上也是你系统的默认编码, 

第二种方法只要明白原理后, 实际上配置起来非常简单, 只要注意下控制台的编码是你电脑的默认编码即可.

第一种解决方案的弊端

第一种解决方案有什么弊端呢?

首先即便你更改了 IDEA 的控制台编码, tomcat 什么的也全部改成 UTF-8, 那么当你单独运行 tomcat 的时候, tomcat 会使用系统控制台打印日志, 那么系统控制台使用的编码是什么呢, 如果你用的是中国的 window, 那么编码格式 9 成 9 是 GBK, 因为这是你的系统默认编码, 无论是 tomcat, jvm, IDEA, 或者是其它开发软件或者是非开发软件, 编码对标的首先是你的电脑系统编码格式.

那么干脆点, 把整台电脑的编码全部改成 UTF-8 编码怎么样呢?

这绝对是个大工程量, 这不是随随便便就改的完的, 其次这会遇到很多问题, 听我一步步分析.

假如你在中国, 使用的是 window, 系统默认编码是 GBK.

  1. 首先你过去的文件, 软件使用的是 GBK 编码. 你之前写的文档, 写的笔记, 以及使用其它软件保存的文件大多都是 GBK, 改起来很麻烦.

  2. 其次网上的资源大多是 GBK, 或是一本小说, 一首歌的歌词, 或是游戏中文翻译包, 或者是视频字幕大多也都是 GBK, 这时候你碰到一个垃圾阅读器, 音乐视频播放器, 游戏软体, 它们不去识别文件 GBK 编码, 直接通过系统默认编码 UTF-8 打开, 然后就会出现乱码情况.

  3. 然后因为你的同事, 你的朋友他们电脑上大多都是 GBK 编码格式, 假如你们使用 git 或 svn 管理文档, 你使用 UTF-8 格式, 你同事大多不修改配置默认使用 GBK, 然后你觉得这样好吗? 哪怕你的编辑器能自动识别编码, 你拉取个 gbk 编码文件, 改动保存后, 再以 utf-8 格式推送出去... 然后一个文档项目就出现了两种编码. 甚至你做个设计流程图, 建个带中文注释的数据表, 同步到你朋友的电脑上, 打开, 卧槽, 乱码了.

  4. 最后, GBK 存储汉字占用空间更小, 非开发工作没有必要使用 UTF-8.


附加技巧

如何找出具体乱码原因

想要知道你的乱码为什么乱码成那样, 请先在你的程序里面打印输出 0信1息2信息3,之后看下乱码情况是以下解码后显示的哪一种乱码, 应该就能找到你的乱码是如何乱码成你看到的样子的.

如下第 6 行, 原信息是0信1息2信息3, 编码格式是 UTF-8 编码, 但是以 GBK 的方式对其进行解码后就变成了0淇�1鎭�2淇℃伅3.上面的表格只是列举了我们绝大多数情况下涉及到的编码 US-ASCII,UTF-8,GBK,UTF-16, 可能你用了之外的其它编码,

另外上面也仅仅是展示了一层转换而已, 可能有以错误编码解码后再次被引用之后再次解码的多次错误转换的情况, 例如 UTF 编码的信息 f 以 GBK 的方式解码后变成了淇 ℃ 伅之后再以 UTF-8 的形式存储后, 再以 GBK 方式打开, 就变成了娣団剝浼 �?.

debug控制台内容消失 idea_IDEA 乱码问题(解决方案篇)相关推荐

  1. 升级到log4j2之后在idea控制台输出日志中文乱码的解决方案

    log4j升级到log4j2之后在idea编辑器的控制台输出日志中文乱码 问题概述: 项目组最近升级了日志系统,由log4j升级到了log4j2,在调试的过程中发现我用的idea编辑器的控制台输出中文 ...

  2. IDEA控制台乱码终极解决方案

    IDEA控制台乱码终极解决方案 参考文章: (1)IDEA控制台乱码终极解决方案 (2)https://www.cnblogs.com/NyanKoSenSei/p/12004845.html 备忘一 ...

  3. Java中文乱码特殊字符解决方案

    Java中文乱码&特殊字符解决方案 相信很多朋友遇到过Java的乱码问题,最近我也在解决一个"使用文本生成图片过程中中文以及特殊字符乱码"的问题:花了我大量时间,Debug ...

  4. 对于tomcat升级导致游览器访问页面出现的中文乱码问题解决方案

    对于升级Tomcat导致 浏览器访问页过程中页面显示中文乱码,解决方案如下. 可以确定是出现乱码和前端没有关系 html已经设置了 js引用也已加上 charset="utf-8" ...

  5. java 特殊字符 乱码_Java中文乱码特殊字符解决方案

    Java中文乱码&特殊字符解决方案 相信很多朋友遇到过Java的乱码问题,最近我也在解决一个"使用文本生成图片过程中中文以及特殊字符乱码"的问题:花了我大量时间,Debug ...

  6. xp系统安装oracle乱码,linux中安装Oracle汉字乱码完整解决方案

    一. 安装JDK 在/tmp下建立一个临时的文件夹 # cd /tmp # mkdir javacn # cd javacn 从网上搜索下载j2sdk-1_4_2_02-linux-i586.bin并 ...

  7. 在git中出现中文乱码的解决方案

    为什么80%的码农都做不了架构师?>>>    综述 : 偶然遇到了这个问题,在网上找了一些答案,没有全部试过,但是这一条命令 git config –global core.quo ...

  8. log4j 控制台和文件输出乱码问题解决

    来源:http://www.coderli.com/log4j-console-file-garbled 一个小问题,却让我感觉到,现在真正动脑的人很少..我来说说吧. 今天遇到一个小问题,log4j ...

  9. python3.x+requests 爬取网站遇到中文乱码的解决方案

    正常情况下,遇见问题上google找答案能甩百度100条街,但是这个问题是个例外······人家老外就没有乱码的问题.言归正传,首先建议大家看一下python3.x+requests 爬取网站遇到中文 ...

最新文章

  1. MFC类结构-1、CObject类
  2. H5前端框架推荐合集 (转)
  3. 金蝶显示中间服务器忙,金蝶显示云服务器繁忙怎么回事
  4. 【oracle】oracle jdbc驱动与c3p0的一个兼容问题
  5. spring和springboot区别
  6. ELDataQuery 基于.NET 2.0的数据查询框架 雏型
  7. Qt Creator基本使用方法
  8. 编写Play 2的模块,第1部分:使工作正常
  9. java中并不是任意多个接口都可以实现多实现
  10. ArchSummit微课堂|蘑菇街DevOps实践及心路历程分享
  11. 这个神器5秒20个爆款标题,关键还免费,做自媒体不会写标题?
  12. ERPS协议学习笔记
  13. C++跨平台开发——SOCKET网络编程中实现客户端对聊
  14. html中怎么隐藏一些符号,html 的一些特殊符号
  15. 关于2022年电改政策的解读
  16. PHP-SDK实现微信付款码支付
  17. aardio - f()函数通过变量名将变量值整合到一串文本中
  18. 超级表格新功能:表格数据支持卡片模式查看
  19. [Java]保留数值后2位的几种方法
  20. python编程阶乘_Python阶乘实现的三种方法

热门文章

  1. 卷积神经网络的实际意义
  2. python进行ocr识别图片上的中文
  3. 09机器学习实战之多元线性回归
  4. 软件开发和产品经理到底是怎么回事
  5. 实现entity、dao 、service 、serviceImpl自动生成
  6. C++实践参考——时间类
  7. Java技术专题之JVM你的内存泄露了吗?
  8. JavaScript学习之对象
  9. [转]VC++下使用ADO操作数据库
  10. 数据库锁解决并发问题