1、前言
在開發JavaWeb的過程當中,不免會出現中文亂碼的問題。接下來寫的是我在解決中文亂碼問題時的學習心得,一是爲了能加深印象,二是但願能幫初學者們解決一些疑惑。若有說的不對的地方,但願及時指出批評。java
2、正文
之因此會出現中文亂碼,是由於在進行I/O時的編碼方式不正確。而I/O主要有磁盤I/O和網絡I/O。下邊咱們就從編寫一個Java文件開始進行分析。數據庫
1.編寫文件網絡
好比當建立一個文本文件,內空寫上「My name is 王某某」,而後直接Ctrl+S保存。再雙擊打開這個文件時理所固然的能看到正確內容。可是當使用Sublime來打開這個文件時(使用UTF-8編碼打開),卻出現這種狀況:
緣由是在使用Ctrl+S直接保存文件的時候,採用的是ANSI編碼(打開剛剛的文本文件,另存爲,能夠看到使用的是哪一種編碼方式
什麼是ANSI編碼方式呢?在簡體中文Windows操做系統中,ANSI表明的是GBK編碼。也就是說剛剛編寫的文件,在保存的時候使用了GBK編碼,打開時用的是UTF-8編碼,固然會出現亂碼了。
因此爲了解決從網上下載的代碼打開時有亂碼這種狀況,只要設置打開文件的編碼方式和該文件自己的編碼方式一致就能夠了。當設置文件的編碼方式爲ISO-8859-1時,不要在文件中寫入中文字符eclipse
2.將Java文件編譯成class文件學習
不管在編寫java文件時使用的是何種編碼方式,在編譯成class文件後,都是同樣的Unicode編碼(準確說是UTF-16編碼)。編碼
3.JVM加載class文件spa
JVM加載class文件使用的是Unicode編碼方式。就是說以前在編寫Java文件時,若是在文件中出現了操作系統
String s="中文字符";
定義的字符串在內存中都是以Unicode編碼的形式存在。
這裏只是說從class文件中加載進來的字符串,不是說全部的的內存中的字符串code
內存中的字符串不只有從class文件中加載進來的,還有從磁盤文件中讀取的、從數據庫中讀取的、從請求中讀取的等等。要保證不出現亂碼問題,固然是要肯定字符串來源的編碼方式,而後再以對應的編碼方式來轉換。對象
4.在控制檯打印亂碼
建立2個Java文件,一個是ANSI編碼,一個是Utf-8編碼,2個Java文件的main方法裏都寫入如下代碼:
String s="i我"; System.out.println(s);
而後使用cmd進行編譯(在編譯utf-8編碼的文件時要在命令後加-encoding utf-8),而後運行,都正常。
而後!我就在eclipse裏進行開發了!我將項目的文件編碼設置成utf-8:
可是!結果卻打印了亂碼!
並且連Servlet中響應的內容也亂碼了!弄到這裏的時候我找了挺多文章都沒有能解決的。而後請教了一位前輩,讓我這樣來設置Eclipse的編碼方式:Window--Preferences--Workspace
而後就解決了eclipse中打印和輸入亂碼問題了。以前Eclipse出現亂碼的緣由我也沒想明白,難道是編譯時沒有使用UTF-8編碼嗎?但願知道的前輩可以指點一下,感激涕零。
5.輸出
Servlet中設置請求和響應對象的編碼方式就能夠了,這個沒啥好說的了。
req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8");