tomcat乱码解决

来源:互联网 发布:办公室走廊设计知乎 编辑:程序博客网 时间:2024/06/02 00:19

乱码了,我的项目在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上新建文本文件,输入联通两个字然后保存退出在打开。你会发现联通成了乱码了。

0 0
原创粉丝点击