1. 程式人生 > >tomcat亂碼解決

tomcat亂碼解決

亂碼了,我的專案在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上新建文字檔案,輸入聯通兩個字然後儲存退出在開啟。你會發現聯通成了亂碼了。