java中的編碼
一.在I/O中存在的編碼
1.讀,Reader,InputStream,InputStreamReader。
Reader是讀字元的父類,InputStream是讀位元組的父類,InputStreamReader是讀取位元組到字元的橋樑,它是委託StreamDecoder去做的。
2.寫,Writer,OutputStream,OutPutStreamWriter。
Writer是寫字元的父類,OutputStream是寫位元組的父類,OutputStreamWriter是寫字元到位元組的橋樑,它是委託StreamEncoder去做的,它負責將字元編碼為位元組。
二.記憶體操作中的編碼
1.String進行位元組與字元的轉換
字元到位元組:byte [] b = s.getBytes("UTF-8");
位元組到字元:String n = new String(b,"UTF-8");
2.用Charset進行轉換
Charset charset = Charset.forName("UTF-8");//設定編碼
ByteBuffer byteBuffer = charset.encode(string);//char 到 byte
CharBuffer charBuffer= charset.decode(byteBuffer );//byte 到 char
三.JavaWeb中的編碼
1.url中的編碼
uri:一般瀏覽器對PathInfo和QueryString的編碼是不一樣的,Tomcat在接收這個URL再轉成char是在org.apache.catalina.connector.ConyoteAdapter的convertURI的方法裡面完成的,如果沒有設定預設是ISO-8859-1編碼,所以有中文URL最好把URIEncoding設定為UTF-8.
QueryString:GET方法的HTTP請求的QueryString和POST方法提交的表單引數都是以Parameters儲存的,解碼會呼叫parseParaments。QueryStringd的解碼字符集要麼是Header的ContentType定義的Charset,要麼是預設的ISO...,所以伺服器最好設定<Connector/>中的URIEncodeing為UTF-8和useBodyEncodingForURI設定為true(為true的話就會使用請求頭裡面的ContentType設定的編碼字符集)
2.HTTP Header
對Header進行解碼是呼叫request.getHeader時進行的,我們無法設定Header的其他解碼方式,它預設是ISO的,如果Header裡面有非ASCII字元,肯定會亂碼。
3.POST表單的編解碼
POST表單傳輸是通HTTP的BODY傳遞到服務端的,當在頁面點選提交按鈕時,瀏覽器先根據ContentType 的Charset對錶單的引數進行編碼,然後提交到服務端,服務端第一次呼叫request.getParamenter來解碼的,我們可以通過requset.setCharacterEncoding(charset)進行設定。不過需要注意的是這個方法要用在request.getParamenter之前,Tomcat在解析Parameter引數集合時會先獲取Header的content-type,但是預設情況下,瀏覽器在提交from表單時,content-type沒有charset資訊。如果沒有進行設定,那麼表單提交的資料將會根據系統預設的編碼。
4.HTTP BODY的編解碼
在伺服器通過Response返回資料給瀏覽器,要先通過response.setCharacterEncoding來設定,它會通過Header的Content-Type返回給客戶端,瀏覽器接收到返回的Socket流時通過Content-Type的charset來解碼,如果沒有設定Content-Type的charset,那麼瀏覽器將會根據HTML的<meta />裡面的charset進行解碼,沒有定義的話就預設