1. 程式人生 > >記一次抓狂的亂碼經歷

記一次抓狂的亂碼經歷

win7 idt 參數 崩潰 tex 讀取 消失 以及 發生

常年Eclipse的守舊派久聞IDEA大名,終於在dalao的安利下入了IDEA的坑((才不是因為可以用翻譯插件


入坑一段時間,因為在編碼方面了解的還算比較多,平時基本沒遇到過亂碼問題,並且在第一次使用IDEA時就修改了設置中所有編碼方式為UTF-8,直到最近做一個小小的javaweb項目,遇到了很奇怪的問題,平時本人都保持使用UTF-8的習慣,各種編輯器都是默認UTF-8編碼,這次出問題的是兩個html文檔與兩個js腳本,均為UTF-8編碼,在本地使用瀏覽器打開時一切正常,但是放到IDEA中,加上設置請求與響應的編碼的過濾器後,在瀏覽器中打開頁面上的中文竟然亂碼了,確定這個問題存在的時候實在非常詫異,在仔細檢查過自己的各種設置,代碼以及文件編碼後確信沒有問題,通過瀏覽器中的開發者工具可以看到AJAX請求得到的響應數據中的中文是正常的,只是html與js這兩種靜態資源亂碼了,嘗試去掉設置編碼的過濾器後,更神奇的事出現了,html與js的不再亂碼了,但是通過AJAX請求得到的響應數據中的中文卻又亂碼了(崩潰)。

在做了各種排查後實在不知道問題發生在哪裏,於是猜測會不會是運行環境的問題(JDK10.0.2 + Tomcat9.0.11),當把運行環境換為(JDK1.8_171 + Tomcat8.5)後,啟用設置編碼的過濾器,亂碼問題竟然奇跡般的消失了。

於是只能將這個問題暫時歸結為環境問題或者是這個項目有問題了。。


晚上吃飯回來,重新建了個項目,用的疑似有問題的環境,一步一步小心的重新建立了之前這個項目的結構,編譯,運行,還是老樣子,html與js亂碼,ajax響應正常,於是開始瘋狂百度,終於在一位前輩的博客中看到了相似的問題:

IDEA啟動TOMCAT靜態頁面時亂碼

前輩的解決分三步:

1.修改IDEA設置中的幾個默認編碼(這個我在安裝後接著就設置了)

File-->Settings-->Editor-->File Encodings

將這三個地方都設置成UTF-8,使文件的編碼格式都是UTF-8(不過這個貌似跟Tomcat亂碼沒多大關系)

技術分享圖片


2. 在VM options添加:-Dfile.encoding=UTF-8,並且將下面兩個屬性設為Update classes and resources (這個我只設置了前半句,後邊這倆個人認為和編碼無關就沒有動)

技術分享圖片

在設置了Tomcat的VM選項後,靜態資源亂碼的問題消失了,根據對這個參數的一知半解,個人認為是:Tomcat是運行在JVM的基礎上,因此受JVM參數的影響,由於我的系統是Win7簡體中文版,系統默認編碼為GBK,因此JVM在不指定這個選項的情況下,也將讀取系統默認編碼作為自己的默認編碼,Tomcat則使用此默認編碼作為讀取普通資源文件時的默認編碼,這就導致了我的UTF-8格式的html與js文件被Tomcat以二進制讀取並使用GBK進行了錯誤解碼得到亂碼字符文件,隨後又通過UTF-8編碼解碼將這堆亂碼呈現到了瀏覽器。

根據上述猜想進行實驗,將我的html文件保存為GBK編碼格式,js保持UTF-8不變,去掉這個VM選項,啟動Tomcat,果然,html文檔顯示正常,通過開發者工具查看加載的js文件,裏面的中文仍然是亂碼,因此可以肯定,Tomcat 9中默認處理靜態資源的Servlet使用了JVM提供的默認編碼來讀取了靜態資源,通過VM選項指定文件編碼為UTF-8後即可解決這個問題。


3. 在第二步操作過後,會發現Tomcat在IDEA控制臺的啟動輸出中的中文(信息、警告等)變成了亂碼。第三步就是將IDEA的啟動選項中也加上這個VM選項(類似Eclipse中在ini中加這個選項)

安裝目錄\bin下,加破解補丁時的那兩個文件(32/64)(*.vmoptions),就是用來為IDEA的啟動指定VM選項的,在這兩個文件中也加上這行,啟動,運行,完美!一切亂碼都消失了~

技術分享圖片


反思與總結

通過這次的亂碼問題,也算是得到了一點經驗,在日後的學習中,凡是基於JVM運行的程序,如果需要統一編碼,都要盡量加上這行VM選項,從而保證不會出現莫名其妙的亂碼問題,在設置了這個選項 後也要註意將軟件中有關編碼的設置一並統一,以免出現其他問題。


-Dfile.encoding=UTF-8

記一次抓狂的亂碼經歷