一、問題引入
在國內,無論是新手還是有一定碼齡的開發人員,漢字編碼問題一直都是繞不開的魔咒,本文主要對tomcat在jetbrain系列產品idea上的亂碼問題提供解決經驗。
二、詳情描述
新手在初學Java Web時,興致沖沖的安裝了tomcat 10.x.x 或其他版本→idea新建web專案→試執行:
大段的紅色亂碼資訊,衝擊著初學者的心靈。
雖然不會實際開發造成影響,但看著這些雲裡霧裡的資訊時還是挺~影響心情的。😱
淇℃伅 --> 資訊
鍛戒護琛屽弬鏁幫細 --> 命令列引數:
三、問題分析
在以前的 javase 學習中,中文亂碼問題是透過統一編碼的方式解決的(GBK和UTF-8)。
但如下圖所示,很明顯這次絕對不像之前那樣能輕鬆解決。我們可以看到在idea的console下的輸出出現了兩種(可能不止兩種)不同的流,且兩種不同的流使用了兩種不同的編碼格式。(即白色的你好!Hello!!!
可以正常顯示,而紅色的資訊卻是亂碼)
這裡解釋一下:「你好!Hello!!!」這部分資訊是我在程式碼裡寫的System.out.println("你好!Hello!!!");
其他是Tomcat的輸出的日誌資訊。
綜上,問題的解決方案應該從Tomcat下手。
四、解決方案
方法一
作者在遇到這個坑的時候一開始是從問題的根本下手的,既然會出現中文亂碼問題那麼直接讓Tomcat輸出英語不就解決了嗎!😸
於是就從網路上找到了解決方法;
Tomcat啟動時會檢查本地語言環境,來呼叫對應的i18n文字,中文環境預設會顯示中文日誌,但在終端中容易出現亂碼,雖然亂碼問題可以透過修改字符集處理,還是想嘗試一下改成英文輸出。剛研究了一下,發現可以透過修改引數來設定輸出日誌的語言,將執行引數中的語言環境設定為英文即可,在此記錄一下修改步驟
此文件所使用的環境如下
Server version name: Apache Tomcat/9.0.62
OS Name: Windows 10
JVM Version: 1.8.0_301-b09修改catalina
修改
bin/catalina.bat
檔案,其中有一項關於CATALINA_LOGGING_CONFIG的配置,大約是230行,不同版本所在行不一樣,大致在那個區間if not "%CATALINA_LOGGING_CONFIG%" == "" goto noJuliConfig set CATALINA_LOGGING_CONFIG=-Dnop if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig set CATALINA_LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" :noJuliConfig
將其中的set語句後面新增language配置
-Duser.language=en -Duser.region=US
,如下set CATALINA_LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" -Duser.language=en -Duser.region=US
注意空格。
提示:如果是在Linux系統,則修改
bin/catalina.sh
檔案修改時間格式
順便改一下顯示日誌中的時間格式,修改
conf/logging.properties
,在ConsoleHandler
區新增timeFormat
配置java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter java.util.logging.ConsoleHandler.encoding = UTF-8 org.apache.juli.OneLineFormatter.timeFormat = yyyy-MM-dd HH:mm:ss
重啟Tomcat檢查修改是否生效。
作者:zhouf_cq
連結:https://www.jianshu.com/p/da8386129a50
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
不得不說,直接改成英文一定是亂碼問題的通解。(直接繞開問題
但是作者一直都有一個壞毛病(X,就是喜歡把所有工具更到最新。
於是就在我的第一次更新Tomcat的時候,它又變成了中文。
Tomcat更新時,會把之前辛苦配置的檔案覆蓋掉,每次都要改一遍。對於我這種懶人來說,一行命令更新後,我可不想重新再修改一遍(這個不是配置檔案,更新後可能會有變動不適合直接copy)。
於是,我就在idea上花費了一番功夫。
方法二
我把idea上的配置全部統一成了utf-8。
檔案編碼
上面是之前學javase的解決的方法。這次只要在上面的設定基礎上新增一個設定。
setting→Editor→General→Console下,修改成UTF-8
Default Encoding 修改成UTF-8
OK
重啟Tomcat
可以看到Tomcat日誌輸出正常了
五、後續問題
之前的問題這裡並沒有完全解決,可以看到System.out.println("你好!Hello!!!");
輸出的中文變成了亂碼。
我們只要在idea裡面配置一下專案配置就可以了。
在此處(紅色的框)新增一句VM option 引數就可以了。
-Dfile.encoding=UTF-8
完美解決!
-Dfile.encoding=UTF-8
這條引數很常見。