tomcat亂碼解決
阿新 • • 發佈:2018-12-31
亂碼了,我的專案在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、使用一致的編碼方案就能夠保證不會亂碼。
4、一個案例分析
上面就是專案的大致結構,該專案會在程式碼中通過get的方式向百度地圖發起一個地址經緯度獲取,但是前臺輸入的地址,在專案中被編碼成?????。就導致了定位不準確。 從上面分析可以看出,前臺傳過來的時候是UTF-8的,但是tomcat也使用了utf-8,但是莫名其妙的就是編碼的時候不是用的UTF-8。最終定位原因是JVM虛擬機器的編碼格式不是UTF-8導致的。啟動tomcat時,新增啟動引數:-Dfile.encoding=UTF-8解決了這個問題。