服务器之家:专注于服务器技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - Tomcat - 一次tomcat源码启动控制台中文乱码的调试过程记录

一次tomcat源码启动控制台中文乱码的调试过程记录

2021-09-24 16:19zhoutaoping1992 Tomcat

平时在使用tomcat做一些服务的时候经常遇到各种乱码问题,下面这篇文章主要给大家介绍了一次tomcat源码启动控制台中文乱码的调试过程,需要的朋友可以参考下

发现问题

今天准备学习下tomcat源码,于是从官网下载了tomcat的源码,导入到idea中,使用maven工具build完项目之后,启动项目,控制台打印了tomcat日志,但是中文都是乱码。

一开始我怀疑是idea的问题,于是在网上找了各种解决办法尝试。大致有这几种:

1、修改run/debug configurations,添加vm options参数:-dfile.encoding=utf-8;

2、修改run/debug configurations,添加enviroment variables参数:java_tool_options:-dfile.encoding=utf-8和java_opts:-dfile.encoding=utf-8;

3、修改idea配置file encodings的3处编码为utf-8;

4、修改idea的custom vm options,添加-dfile.encoding=utf-8;

5、修改idea的安装目录bin下的idea.exe.vmoptions和idea64.exe.vmoptions文件,添加-dfile.encoding=utf-8;

6、修改项目下的.idea文件夹下的encodings.xml文件,不是utf-8的改为utf-8;

7、修改tomcat的配置文件logging.properties,将里面的utf-8改为gbk;

8、修改完删除target文件夹重新编译;

9、修改完重启idea。

尝试完所有方法后,控制台日志乱码问题并没有解决,如图:

一次tomcat源码启动控制台中文乱码的调试过程记录

仔细观察后,发现日志左边的日志等级”信息”和”严重”之类的中文乱码解决了,但是日志中还有乱码。

感觉应该是代码的问题,于是决定debugger代码,先从日志的第一行开始。

17-feb-2020 10:10:08.585 信息 [main] org.apache.catalina.startup.versionloggerlistener.log server.æœåŠ¡å™¨ç‰ˆæœ¬:     apache tomcat/@version@

找到org.apache.catalina.startup.versionloggerlistener类的log()方法,打断点一步一步跟踪

一次tomcat源码启动控制台中文乱码的调试过程记录

最终发现所有的值存在了propertyresourcebundle类的lookup的map集合中,集合中的数据已经乱码了。

一次tomcat源码启动控制台中文乱码的调试过程记录

于是继续debugger查看lookup的加载,通过源码查看lookup集合中的数据是从properties文件中读取出来的。查看该properties文件编码也是utf-8。于是继续查看源码。

一次tomcat源码启动控制台中文乱码的调试过程记录

resourcebundle中的is = classloader.getresourceasstream(resourcename);加载的这个properties文件

一次tomcat源码启动控制台中文乱码的调试过程记录

再通过propertyresourcebundle构造方法加载的数据。

正准备修改这块代码时,发现这竟是jdk中的类,无法修改。(后来才知道resourcebundle是用来做国际化的)。

后来查资料知道了:在java中, 读取文件的默认格式是iso8859-1, 而我们中文存储的时候一般是utf-8. 所以导致读出来的是乱码。

解决方案有两种:

1、使用jdk下的工具native2ascii.exe将properties文件转为unicode编码。转换后如图:

一次tomcat源码启动控制台中文乱码的调试过程记录

2、在代码中获取到了值之后手动重新编码解码下

?
1
2
3
4
5
6
7
8
9
try {
 
    value = new string(value.getbytes("iso-8859-1"), "utf-8");
 
}catch(exception e){
 
    e.printstacktrace();
 
}

经过测试,两种方法都可以解决问题。

因为tomcat中properties文件过多,我采用了第二种方法,修改了tomcat源码,修改如下:

1)org.apache.tomcat.util.res.stringmanager类中的getstring(final string key, final object... args)方法。

一次tomcat源码启动控制台中文乱码的调试过程记录

2)org.apache.jasper.compiler.localizer类的getmessage(string errcode)方法

一次tomcat源码启动控制台中文乱码的调试过程记录

至此,乱码问题解决

一次tomcat源码启动控制台中文乱码的调试过程记录

总结

到此这篇关于一次tomcat源码启动控制台中文乱码调试过程记录的文章就介绍到这了,更多相关tomcat源码启动控制台中文乱码内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/zhoutaoping1992/article/details/104751705

延伸 · 阅读

精彩推荐
  • Tomcat学习javaweb如何配置Tomcat的热启动

    学习javaweb如何配置Tomcat的热启动

    学习javaweb的时候每次更改项目都需要重新部署项目,如此一来比较麻烦,使用tomcat的热启动就可以解决这个问题...

    whsnow12072021-08-04
  • Tomcat如何将Tomcat设置为自动启动的服务最快捷方法

    如何将Tomcat设置为自动启动的服务最快捷方法

    这篇文章主要介绍了如何将Tomcat设置为自动启动的服务最快捷方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    锋齐叶落5352021-09-03
  • Tomcat如何查看tomcat的控制台输出的方法

    如何查看tomcat的控制台输出的方法

    这篇文章主要介绍了如何查看tomcat的控制台输出的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    CaiCaiNeo11972021-08-29
  • Tomcat浅谈Tomcat多层容器的设计

    浅谈Tomcat多层容器的设计

    Tomcat的容器用来装载Servlet。那Tomcat的Servlet容器是如何设计的呢,本文就详细的来介绍一下,具有一定的参考价值,感兴趣的可以了解一下...

    JavaEdge.9612021-09-26
  • TomcatTomcat目录结构详解

    Tomcat目录结构详解

    Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,学习tomcat目录结构十分有必要,今天小编给大家带来了详细教程,感兴趣的朋友一起看看吧...

    ThinkWon6712021-09-09
  • Tomcattomcat 6.0.20在一个机器上安装多个服务的方法

    tomcat 6.0.20在一个机器上安装多个服务的方法

    本文主要为大家介绍tomcat 6.0.20在一个机器上安装多个服务的方法,当前前提是你已经可以同时运行他们了,他们的端口不能相同,这里只是解释如何把它们...

    Tomcat教程网10052021-08-03
  • TomcatTomcat正常访问localhost报404问题解决

    Tomcat正常访问localhost报404问题解决

    这篇文章主要介绍了Tomcat正常访问localhost报404问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    小明Style5592021-09-23
  • TomcatTomcat服务器搭建教程

    Tomcat服务器搭建教程

    这篇文章主要为大家详细介绍了Tomcat服务器搭建教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Watom_66310452021-08-20