Tomcat启动中文乱码问题

2022-08-18 11:47:32

前言

IDEA中启动一个项目,又或者在bin目录下启动startup.bat
tomcat启动日志总是中文乱码,强迫症的我实在受不了,就网上查询了解决方案。
懒得看的细节同志可以直接从目录跳转第三种方案

一、乱码原因

系统CMD运行时的编码方式是GBK,而tomcat日志默认编码方式为UTF-8
所以启动tomcat时,中文日志就会乱码

二、解决方案

本人使用tomcat 9版本
解决方案都是从互联网搜寻获得,如有其他方案,希望补充

1.将tomcat日志配置改为GBK编码(不推荐)

打开tomcat的conf目录,编辑logging.properties配置文件。
大概在51行

java.util.logging.ConsoleHandler.encoding = UTF-8

将UTF-8改为GBK即可
不推荐使用此方法,因为UTF-8编码方式更通用

2.IDEA配置自定义VM选项

在这里插入图片描述
在这里插入图片描述
在最后一行加一句
-Dfile.encoding=UTF-8
重启IDEA后,启动tomcat中文就不会乱码,但是startup.bat不知道是否乱码,没有尝试,因为我用了第三种方法。

3.修改系统默认编码方式(本人使用)

打开控制面板-> 区域-> 更改系统区域设置
在这里插入图片描述
在这里插入图片描述

勾选UTF-8即可
此时查看cmd属性
在这里插入图片描述

新打开cmd都是UTF-8的编码方式
(修改之前每次都是默认GBK编码,修改后好像cmd界面有些变化)

此时不论是IDEA还是直接使用startup.bat启动,都不会乱码

3.1寻找方法时的小插曲

在寻找第三种方法时我曾查询如何使cmd永久保持UTF-8编码
在cmd中输入:chcp 65001
可以让本次窗口改编为utf-8编码
输入chcp 936 可本次改回GBK模式
永久更改是写了一个注册表
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor

在这里插入图片描述
点击右键-新建,选择“字符串值”。
在这里插入图片描述
命名为“autorun”, 点击右击修改,数值数据填写“chcp 65001”,确定。

此方法百度经验查询获得
本质上和前面没什么区别,就是每次打开cmd改为UTF-8,
但是对于启动startup.bat中文乱码,没有任何作用

下面引用CSDN另一个文章永久修改cmd编码的文章

永久性修改就是通过修改注册注册表达到。

打开注册表方法:略

定位到:HKEY_CURRENT_USER\Console%SystemRoot%_system32_cmd.exe

PS:近期看到下面评论反应很多人在这里找不到 cmd 的选项,由于最近换了新电脑,新安装的 window 10 1903
专业版确实默认找不到(旧版升级过来的可能还保留有),考虑到自己手动添加也比较麻烦,建议大家直接转投 powershell 吧,毕竟
powshell 更强大,也是微软主推的未来的趋势(未来 cmd 就会被 powshell替代掉),而且 powshell 也借鉴了一些
Linux bash 的使用习惯,而且 powshell 是跨平台的哟,你也可以在 Linux 下安装使用,替代 Linux 默认的
bash 。更多详情参考:powshell 官方文档

对于没有 CodePage 的,可以鼠标右键-> 新建 -> DWORD(32位)值,创建即可。
在这里插入图片描述

之后通过 “shift + 鼠标右键” 打开的 powershell 默认代码页就是 65001 即 UTF-8。

同理你也可以修改:powershell
的默认编码。如果有人因为权限问题无法修改的,可以右键左边选中的红框,选择权限,赋给自己完全控制的权限就OK了!

顺便补充一篇跟本文有关系的另一篇博文:将 Windows10 中的 bash 添加至右键菜单

此外微软新版的 window terminal 也已在 window
商店上架,新版对字体支持更加友好,更多特性可以参考:https://github.com/microsoft/terminal

———————————————— 版权声明:本文为CSDN博主「「已注销」」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gulang03/article/details/81771343

此博主方法没有尝试,因为是powershell,效果不太确定

三、新问题tomcat日志正常,但是print中文乱码

2022/1/10

又发现了新的问题,方法二和方法三需要混合使用
方法三可以让cmd转为UTF-8,
方法二可以让IDEA转为UTF-8

2022/1/11

在学习tomcat的servlet时发现
tomcat日志中文是正常的
但是通过System.out.println(“中文”)
就会乱码

@OverrideprotectedvoiddoGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        ServletContext context=this.getServletContext();
        System.out.println("进入了getdispatcher");
        context.getRequestDispatcher("/gp").forward(req,resp);

        String charset="GBK";//假定编码格式
        String str="中文";boolean flag= str.equals(newString(str.getBytes(),charset));
        System.out.println(flag);
        System.out.println("当前JRE:"+ System.getProperty("java.version"));
        System.out.println("当前JVM的默认字符集:"+ Charset.defaultCharset());}

但是如果离开server环境单独测试时却不同

import java.io.UnsupportedEncodingException;import java.nio.charset.Charset;publicclassTestCharacter{publicstaticvoidtest(){
        System.out.println("当前JRE:"+ System.getProperty("java.version"));
        System.out.println("当前JVM的默认字符集:"+ Charset.defaultCharset());}publicstaticvoidtest2(){
        String charset="GBK";//假定编码格式
        String str="中文";boolean flag=true;try{
            flag= str.equals(newString(str.getBytes(),charset));}catch(UnsupportedEncodingException e){
            e.printStackTrace();}
        System.out.println(flag);}publicstaticvoidmain(String[] args){test();test2();}}

会出现这样的结果
在这里插入图片描述

最后百度增加了环境变量
在系统的环境变量中添加一个变量,名为: JAVA_TOOL_OPTIONS, 值为:-Dfile.encoding=UTF-8
这样就能让server下的中文也变成UTF-8编码
在这里插入图片描述
问题虽然解决了但是我还是感觉很混乱
于是我做了以下尝试

test1:

测试条件:
删除了环境变量 JAVA_TOOL_OPTIONS.
在tomcat配置VM- options: 填入:-Dfile.encoding=UTF-8
IDEA help->edit custom VM options中保留-Dfile.encoding=UTF-8

在这里插入图片描述
测试结果:
server中的tomcat日志中文正常显示
server中的println中文正常显示

test2:

测试条件:
环境变量设置JAVA_TOOL_OPTIONS -Dfile.encoding=UTF-8
删除tomcat中的 -Dfile.encoding=UTF-8配置
删除help中的 -Dfile.encoding=UTF-8配置

测试结果
server中的tomcat日志中文正常显示
server中的println中文正常显示

注意所有测试前提,都是已经全部设置为UTF-8环境的,包括一开始出错
在这里插入图片描述

结论:

也就是说只需要设置一个环境变量就可以代替tomcat和VM options配置

  • 作者:TwilightPureDrm
  • 原文链接:https://blog.csdn.net/weixin_44745548/article/details/122395060
    更新时间:2022-08-18 11:47:32