二 Java 編碼那些事( 二 )


二 Java 編碼那些事

文章插圖
而讀取文本文件內容一般有兩種方式,第一種是字符流,第二種是字節流,字節流可以指定字符編碼也可以通過的JVM啟動參數-Dfile.encoding指定默認編碼 。
明白了上面的問題,我們就能知道為什么亂碼了,這是因為IDEA的默認編碼和這個日志文件的編碼格式不統一導致的 。
解決方案很簡單,統一兩個系統的編碼,對于Tomcat的輸出的日志文件,我們可以設置Tomcat啟動的VM選項:Edit Configurations->Server-> VM options編輯添加:-Dfile.encoding=UTF-8
設置完Tomcat編碼后,刪除剛剛路徑中的日志文件,重啟Tomcat服務,再使用記事本打開剛剛的日志文件,另存為我們可以發現,編碼已經變成了UTF-8 。
IDEA接下來設置IDEA的編碼,IDEA默認編碼暫時沒有找到查找方式 , 我們也可以將其指定為UTF-8,找到IDEA的安裝路徑 , 在bin目錄中可以發現一個名為idea.exe.vmoptionsidea64.exe.vmoptions選項,分別打開,添加-Dfile.encoding=UTF-8后,重啟IDEA.
完成上面兩步后 , 再次啟動Tomcat服務,你會發現日志已經正常 。
注:如果依然發現亂碼,則可能是IDEA緩存了當前項目的編碼設置 , 你可以在當前項目的.idea文件夾中找到encoding.xml文件,刪除所有不是UTF-8的編碼設置,重啟IDEA即可 。
網頁亂碼我們都知道,瀏覽器瀏覽的網頁其實是從服務器發送的HTML文件到瀏覽器中顯示,而發送的是通過字節流傳輸 , 這個過程就涉及到解碼->編碼的過程,在HTTP協議中 , 編碼的協議通過Header中的charset中設置 。
為什么放header,因為HTTP請求會先解析header , 而且header一般不會有ascii無法解析的字符,一般都是英文
網頁亂碼其實很好解決,如果發現在Servlet中,返回中文給瀏覽器的時候瀏覽器返回的是???
點擊F12,抓包網絡后,找到Response Body 中的charset選項,可以發現charset=ISO-8859-1
也就說默認的Tomcat使用的編碼是ISO-8859-1,這是西歐的語言編碼,它是不兼容中文的 。如果你在Servlet返回的結果中添加一點法語:? ?或者德語什么的 , 你會發現會正常顯示 。
charset的意思便是Tomcat是以什么樣的方式編碼字節,而瀏覽器便會以這樣的編碼方式解碼字節 。
【二 Java 編碼那些事】我們可以將charset修改為兼容中文的即可,比如UTf-8,GB2312等,建議使用UTF-8,在Servlet中,設置編碼的方式為:
response.setCharacterEncoding("UTF-8");也可以如下:
 resp.setContentType("text/html;charset=UTF-8");建議第一種方式 。
到這里 , 所有的亂碼問題都已經解決 。
其實,亂碼不可怕,可怕的是經歷了這么多次亂碼卻依然不去了解它 。
~~
微信搜索公眾號:StackTrace,關注我,不斷學習,不斷提升

推薦閱讀