1.情景展示
做了這么長時間的java開發,但是,你知道JVM是以怎樣的編碼加載、解析class文件的嗎?
我們知道,通常情況下,我們會將java文件的字符集修改成utf-8,這樣,理所當然地就認為:JVM在加載class的時候,自然是按照utf-8進行解析的。
事實並非如此:JVM加載class文件默認采用的字符集,是由操作系統來決定的。
換句話說,JVM會根據操作系統的字符集來解析你的class文件,而不是智能的去判斷你的class文件的字符集而進行解析。
這樣,肯定有問題。
2.原因分析
以win7/win10中文操作系統為例,我們借助開發工具以utf-8將java文件編譯成class文件,而解析的時候卻以GBK的編碼加載到JVM中,不出問題才怪!
但是,問題恰恰就出現在了這里,一直都是以utf-8進行編譯,以gbk進行解析,中文也沒有出現亂碼問題,至於為什么,我沒有想通。
今天的重點不在這里,重點是,我們怎么讓JVM以utf-8的格式解析class文件?
3.解決方案
方案一:設置環境變量
快捷鍵:win+r--》輸入sysdm.cpl-->回車--》高級--》環境變量--》系統變量--》新建
變量名設置為:JAVA_TOOL_OPTIONS
變量值設置為: -Dfile.encoding=UTF-8
確定即可。
方案二:修改tomcat
路徑:{TOMCAT_HOME}/bin/catalina.bat
打開該文件,在有對JAVA_OPS設置的地方,添加代碼
:設置JVM以utf-8格式解析class文件 set "JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8"
重新啟動tomcat即可。
注意:如果你像上面那樣修改成utf-8后,重啟后的tomcat,日志肯定亂碼。
因為Tomact日志字符集采用的是gbk,java強制將gbk轉換成utf-8后,造成亂碼是自然的事情了。
位置:{TOMCAT_HOME}/conf/logging.properties文件
#指定tomcat日志字符集 java.util.logging.ConsoleHandler.encoding = GBK
修改成功后,日志便不再亂碼。
提醒:在Windows下,在黑窗口使用命令對java文件進行編譯且沒有指定字符集的前提下,編譯時默認采用的也是gbk的編碼,與java文件本身的字符集無關。