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

云服务器|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

延伸 · 阅读

精彩推荐
  • TomcatEclipse创建tomcat实现过程原理详解

    Eclipse创建tomcat实现过程原理详解

    这篇文章主要介绍了Eclipse创建tomcat实现过程原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    海绵般汲取11642021-09-16
  • Tomcat解决Tomcat的maxPostSize属性的配置需要注意的问题

    解决Tomcat的maxPostSize属性的配置需要注意的问题

    这篇文章主要介绍了解决Tomcat的maxPostSize属性的配置需要注意的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...

    life is wonderful12012021-09-13
  • TomcatTomcat CentOS安装实现过程图解

    Tomcat CentOS安装实现过程图解

    这篇文章主要介绍了Tomcat CentOS安装实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考...

    agrin5842021-09-15
  • Tomcat如何查看tomcat的控制台输出的方法

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

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

    CaiCaiNeo11932021-08-29
  • TomcatTomcat安装配置方法图文教程

    Tomcat安装配置方法图文教程

    这篇文章主要为大家详细介绍了Tomcat安装配置方法图文教程,java环境变量如何配置,Eclipse安装配置方法图文教程 ,为大家分享了三个教程,感兴趣的小伙...

    Tomcat教程网13292021-08-11
  • TomcatTomcat整体结构简单介绍

    Tomcat整体结构简单介绍

    这篇文章主要介绍了Tomcat整体结构简单介绍,Tomcat的本质是一个Servlet容器。一个Servlet能做的事情是:处理请求资源,并为客户端填充response对象,需要的朋友...

    叫我田露也行12302021-09-07
  • TomcatTomcat服务器的安全设置

    Tomcat服务器的安全设置

    tomcat是一个开源Web服务器,基于Tomcat的Web运行效率高,可以在一般的硬件平台上流畅运行,因此,颇受Web站长的青睐。不过,在默认配置下其存在一定的安...

    IT专家网9002021-08-03
  • Tomcat一次tomcat源码启动控制台中文乱码的调试过程记录

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

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

    zhoutaoping199211852021-09-24