Java編譯器在對源文件編譯前
會先把源文件轉換為unicode編碼
因為這個原因
我們在編譯時一定要把源文件用的是什麼編碼方式正確無誤的
告訴
編譯器
例如
我們的源文件是以UTF
的方式保存的
而在編譯時編譯器卻把它當作是用GBK方式保存的
這樣編譯器就會按照GBK
>Unicode的編碼轉換方法對源文件進行轉換
然後再編譯
這樣當然會出錯
實際上編譯器應當按照UTF
>Unicode的編碼轉換方法來對源文件進行轉換
a.對於控制台程序
編譯器會把源文件看作是由系統默認的編碼類型來編碼的(系統默認的編碼類型取決於在控制面板區域設置裡的配置
中文win
k下通常是GBK)
也可以使用
encoding參數來設置
如
javac
encoding UTF
這樣編譯器就會把源文件看作是用UTF
編碼的(這只是告訴編譯器源文件的編碼類型
而不是對源文件轉碼)
在各種語言的平台上只要在編譯用時
encoding指定與源文件的編碼相同的編碼方式
就不會存在國際化的問題了
b.對於JSP
編譯器則會根據設定的字符集來判斷JSP文件使用的是什麼編碼方式
進而將其轉換成unicode後進行編譯
若JSP中未指定
編譯器則會把JSP文件看作是按照系統默認的編碼來保存的
在JSP
裡新增了一個指令來通知編譯器這個源文件所使用的編碼方式
在處理輸入輸出時
注意設置輸入流和輸出流的編碼類型與用戶輸入時和輸出設備顯示時采用的編碼方式一致
由於JRE在處理輸入輸出時會將輸入或輸出的內容進行編碼轉換
對於輸入會轉換為unicode後再送入
因此要正確的匹配實際輸入內容的編碼方式和告知JRE的編碼方式
對於輸出
會由unicode轉換為其他的編碼再送出程序
因此要正確匹配輸出設備顯示時用的編碼方式和告知JRE的編碼方式
例如
程序中設置輸入流的編碼是new InputStreamReader(System
in
GB
)
而程序運行後用戶輸入時用了繁體中文的輸入法
輸入了BIG
編碼的內容
這樣JRE把BIG
編碼的內容當作GB
的進行了GB
>unicode的編碼轉換
這樣轉換後的結果顯然不是用戶想要輸入的內容了
默認情況下
JRE會把輸入輸出的內容當作是按照系統默認編碼方式編碼的
在Servlet中
除了一定要把源文件用的是什麼編碼方式正確無誤的
告訴
編譯器外
還要注意實際提交的URL數據
表單數據的編碼格式和request中聲明的編碼格式一致
客戶端浏覽器在通過表單和URL提交數據時
容器和JVM會將request中的數據看作是按照request所聲明的編碼方式來編碼的
將數據由這種編碼方式轉換為unicode後再送入servlet(實際上容器會先將request中的數據轉為一種中間編碼方式
具體根據容器的配置而定
再由JVM由這種中間方式轉換為unicode
通常這種中間格式是ISO)
servlet輸出的unicode數據會由容器根據response中聲明的編碼方式進行轉換
再送到客戶端浏覽器上
在接收客戶端輸入時
用request
setCharacterEncoding()聲明請求中數據的編碼方式
在向客戶端輸出時用response
setContentType(
text/html;charset=
)
聲明響應的數據的編碼方式
告知浏覽器以哪種編碼方式顯示
在JSP中
由於JSP本就會被JSP編譯器編譯為servlet來運行
因此情況與servlet相同
這兩個JSP指令聲明了請求和響應的編碼方式
只要確保URL參數或表單中數據的編碼方式和所聲明的編碼方式一致
再通過告知JSP編譯器本JSP文件采用的編碼方式及含有哪種字符
即可解決JSP的字符編碼問題
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19279.html