Tomcat启动中文乱码问题

目录

  • 前言
  • 一、乱码原因
  • 二、解决方案
    • 1.将tomcat日志配置改为GBK编码(不推荐)
    • 2.IDEA配置自定义VM选项
    • 3.修改系统默认编码方式(本人使用)
      • 3.1寻找方法时的小插曲
  • 三、新问题tomcat日志正常,但是print中文乱码
    • 2022/1/10
    • 2022/1/11
      • test1:
      • test2:
    • 结论:

前言

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选项

Tomcat启动中文乱码问题_第1张图片
Tomcat启动中文乱码问题_第2张图片
在最后一行加一句
-Dfile.encoding=UTF-8
重启IDEA后,启动tomcat中文就不会乱码,但是startup.bat不知道是否乱码,没有尝试,因为我用了第三种方法。

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

打开控制面板-> 区域-> 更改系统区域设置
Tomcat启动中文乱码问题_第3张图片
Tomcat启动中文乱码问题_第4张图片

勾选UTF-8即可
此时查看cmd属性
Tomcat启动中文乱码问题_第5张图片

新打开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

Tomcat启动中文乱码问题_第6张图片
点击右键-新建,选择“字符串值”。
Tomcat启动中文乱码问题_第7张图片
命名为“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位)值,创建即可。
Tomcat启动中文乱码问题_第8张图片

之后通过 “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(“中文”)
就会乱码

 @Override
    protected void doGet(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(new String(str.getBytes(),charset));
        System.out.println(flag);
        System.out.println("当前JRE:" + System.getProperty("java.version"));
        System.out.println("当前JVM的默认字符集:" + Charset.defaultCharset());


    }

Tomcat启动中文乱码问题_第9张图片

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

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;



public class TestCharacter {
    
    public static void test(){
        System.out.println("当前JRE:" + System.getProperty("java.version"));
        System.out.println("当前JVM的默认字符集:" + Charset.defaultCharset());
    }

    public static void  test2(){
        String charset ="GBK"; //假定编码格式
        String str = "中文";
        boolean flag = true;
        try {
            flag = str.equals(new String(str.getBytes(),charset));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(flag);
    }

    public static void main(String[] args) {
        test();
        test2();
    }
}

会出现这样的结果
Tomcat启动中文乱码问题_第10张图片

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

test1:

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

Tomcat启动中文乱码问题_第12张图片
测试结果:
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启动中文乱码问题_第13张图片

结论:

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

你可能感兴趣的:(Java,tomcat,intellij-idea,java)