在IDEA中启动一个项目,又或者在bin目录下启动startup.bat
tomcat启动日志总是中文乱码,强迫症的我实在受不了,就网上查询了解决方案。
懒得看的细节同志可以直接从目录跳转第三种方案
系统CMD运行时的编码方式是GBK,而tomcat日志默认编码方式为UTF-8
所以启动tomcat时,中文日志就会乱码
本人使用tomcat 9版本
解决方案都是从互联网搜寻获得,如有其他方案,希望补充
打开tomcat的conf目录,编辑logging.properties配置文件。
大概在51行
java.util.logging.ConsoleHandler.encoding = UTF-8
将UTF-8改为GBK即可
不推荐使用此方法,因为UTF-8编码方式更通用
在最后一行加一句
-Dfile.encoding=UTF-8
重启IDEA后,启动tomcat中文就不会乱码,但是startup.bat不知道是否乱码,没有尝试,因为我用了第三种方法。
新打开cmd都是UTF-8的编码方式
(修改之前每次都是默认GBK编码,修改后好像cmd界面有些变化)
此时不论是IDEA还是直接使用startup.bat启动,都不会乱码
在寻找第三种方法时我曾查询如何使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 官方文档
之后通过 “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,效果不太确定
又发现了新的问题,方法二和方法三需要混合使用
方法三可以让cmd转为UTF-8,
方法二可以让IDEA转为UTF-8
在学习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());
}
但是如果离开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();
}
}
最后百度增加了环境变量
在系统的环境变量中添加一个变量,名为: JAVA_TOOL_OPTIONS, 值为:-Dfile.encoding=UTF-8
这样就能让server下的中文也变成UTF-8编码
问题虽然解决了但是我还是感觉很混乱
于是我做了以下尝试
测试条件:
删除了环境变量 JAVA_TOOL_OPTIONS.
在tomcat配置VM- options: 填入:-Dfile.encoding=UTF-8
IDEA help->edit custom VM options中保留-Dfile.encoding=UTF-8
测试结果:
server中的tomcat日志中文正常显示
server中的println中文正常显示
测试条件:
环境变量设置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配置