tomcat乱码解决

项目在Tomcat中出现乱码问题,仅在Linux控制台显示日志时出现,尽管浏览器和数据库正常。已确认项目、Linux及Tomcat配置均采用UTF-8编码,但xshell显示仍为乱码。文章将探讨编码历史、常见编码类型,并通过案例分析解决此特定乱码问题。

乱码了,我的项目在tomcat中乱码了。。。。

      问题的现象:浏览器看是不乱码的,mysql数据库也是不乱码的。但是在linux控制台上看项目的日志却是乱码的。项目使用的统一编码是UTF-8,Linux使用的也是UTF-8的编码,TOMCAT的配置文件还专门配置了UTF-8,xshell工具设置也是UTF-8的编码,但是就是打印出的日志是乱码的,都是?????? 

      如果你也是这个问题,可以往下看。如果想了解一些编码问题如何分析解决,也可以看看。

1、编码的由来
      可以先看个小故事,传送门: 编码小故事
2、常见的编码
      通过那个小故事我们了解到很多编码,其中项目中大多使用到的编码是:UTF-8,GBK,ISO8859-1。
      UTF-8:变长编码,通常一个汉字会编码成3个字符。
      GBK:定长编码,通常一个汉字编码成2个字符。英文也是两个字符,不过是全角。如果使用半角则英文编码成一个字符。
      ISO8859-1:定长编码,不支持汉字。通常编码长度是一个字符。
3、分享下常见的乱码格式
      大多数情况下当我们看不懂的时候我们只知道乱码了,但是并不知道乱码产生的原因,以及什么编码转什么编码。下面通过一个小程序展示常见的乱码,以及产生的情况。
public static void main(String[] args) throws Exception {
	// 编码
	String GBK = "GBK";
	String UTF8 = "UTF-8";
	String ISO8859 = "ISO8859-1";
	// 编码
	String str = "abc南海是中国的";
	byte[] iso8859 = str.getBytes(ISO8859);
	byte[] gbk = str.getBytes(GBK);
	byte[] utf8 = str.getBytes(UTF8);
	// 解码
	System.out.println("ISO 编码,ISO 解码:" + new String(iso8859, ISO8859));
	System.out.println("ISO 编码,GBK 解码:" + new String(iso8859, GBK));
	System.out.println("ISO 编码,UTF8解码:" + new String(iso8859, UTF8));
	System.out.println("GBK 编码,ISO 解码:" + new String(gbk, ISO8859));
	System.out.println("GBK 编码,GBK 解码:" + new String(gbk, GBK));
	System.out.println("GBK 编码,UTF8解码:" + new String(gbk, UTF8));
	System.out.println("UTF8编码,ISO 解码:" + new String(utf8, ISO8859));
	System.out.println("UTF8编码,GBK 解码:" + new String(utf8, GBK));
	System.out.println("UTF8编码,UTF8解码:" + new String(utf8, UTF8));
}
      上面的程序执行结果如下:
      从上面可以得出几个很有用的结论:
      1、如果乱码格式是�Ϻ����й� :那么就是GBK编码,然后采用了UTF-8解码了。
      2、如果乱码格式是鍗楁捣鏄腑鍥界殑 :那么就是UTF-8编码,然后采用GBK解码了。
      3、如果出现的???这种:那么就是 ISO8859-1编码,GBK或者UTF-8解码。
      4、如果格式是ÄϺ£ÊÇÖйúµÄ :那么可以说是GBK或者UTF-8编码,然后ISO8859-1解码。
      5、半角的英文字符是怎么都不会乱码的。
      6、使用一致的编码方案就能够保证不会乱码。
      知道这个有什么用呢?比如说,你知道你JSP文件使用的是UTF-8,但是前台浏览器里面显示了 鍗楁捣鏄 。那么你就应该能猜出来,这里就是前端使用了GBK导致的。所以需要设置JSP的contentType。
      如果你打开一个文件发现都是����й�,那么你就应该知道,原先的文本文档格式是GBK的,但是文本编辑工具设置编码是UTF-8了,所以设置一下编码就可以了。
4、一个案例分析
      上面就是项目的大致结构,该项目会在代码中通过get的方式向百度地图发起一个地址经纬度获取,但是前台输入的地址,在项目中被编码成?????。就导致了定位不准确。
      从上面分析可以看出,前台传过来的时候是UTF-8的,但是tomcat也使用了utf-8,但是莫名其妙的就是编码的时候不是用的UTF-8。最终定位原因是JVM虚拟机的编码格式不是UTF-8导致的。 启动tomcat时,添加启动参数:-Dfile.encoding=UTF-8解决了这个问题。
5、一个有趣的事
      windows上新建文本文件,输入联通两个字然后保存退出在打开。你会发现联通成了乱码了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值