出處:http://www.cnblogs.com/tangyanbo/1. 編碼基礎知識1.1 編碼ISO-8859-1編碼是單位元組編碼,向下相容ASCII,其編碼範圍是0x00-0xFF,0x00-0x7F之間完全和ASCII一致,0x80-0x9F之間是控制字元,0xA0-0xFF之間是文字元...
出處:http://www.cnblogs.com/tangyanbo/
1. 編碼基礎知識
1.1 編碼
ISO-8859-1編碼是單位元組編碼,向下相容ASCII,其編碼範圍是0x00-0xFF,0x00-0x7F之間完全和ASCII一致,0x80-0x9F之間是控制字元,0xA0-0xFF之間是文字元號
單位元組,即一個位元組對應一個編碼,不能編碼漢字
1.2 GBK
1) 能編碼漢字,一個漢字用2個位元組編碼
2) 編碼的漢字比GB2312更多
1.3 GB2312
能編碼漢字,一個漢字用2個位元組編碼
1.4 UTF-8
能編碼漢字,一個漢字用3個位元組編碼
漢字,字母,特殊符號,gbk和utf-8之間是可以互相轉換的
2. Web系統轉換編碼
2.1 原理
這裡邊有個編碼和解碼的過程
網路傳輸發送端需要將字元串編碼成位元組
可以是utf-8,gbk等,轉換成位元組的過程中不能丟失編碼
接收端需要用發送端同樣的編碼方式進行解碼,否則將出現亂碼
一般由服務端確定一種編碼和解碼的方式,
然後告知客戶端編碼和解碼的方式
網路傳輸編碼
2.2.1 接收瀏覽器POST請求
設置瀏覽器編碼和解碼方式為utf-8
如:
<%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8" language="java"%>
服務端解碼方式1:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
服務端解碼方式2:
request.setCharacterEncoding("UTF-8");
2.2.2 接收瀏覽器GET請求
如:
http://localhost:8888/webtest/EncodeServlet?name=你好
瀏覽器將會對url進行urlEncode,編碼方式為UTF-8
服務端解碼方式:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
此處用request.setCharacterEncoding("UTF-8");來設置解碼,不能奏效,原因是get請求將參數拼在url後面進行url encode,而web容器對url的解碼是在調用servlet之前,且預設解碼方式是iso-8859-1
2.2.3 響應給瀏覽器
Response設置編碼:
Response是指響應給客戶端時,位元組的編碼方式,預設為ISO-8859-1
可用如下方法查看:
response.getCharacterEncoding();
設置響應流的編碼方式:
response.setCharacterEncoding("UTF-8");
設置瀏覽器的編碼和解碼方式:
response.setContentType("text/html;charset=UTF-8");
jsp設置:
<%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8" language="java"%>
pageEncoding:設置jsp文件存儲編碼
contentType裡面的charset:設置瀏覽器端傳輸的編碼和解碼
解析響應時解碼,發送請求時編碼
要保持響應流和編碼和瀏覽器解碼方式一致,才能不亂碼
2.2.4 HTTPClient設置編碼
控制編碼
Struts.xml中做如下配置:
<constant name="struts.i18n.encoding" value="utf-8"></constant>
2.4 Spring控制編碼
Web.xml中配置如下:
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter>
其中encoding設置服務端編碼和解碼的方式
forceEncoding表示強制編碼的方式
3. 字元串轉位元組轉碼
String s = "s漢"; byte[] bytes1 = s.getBytes("ISO-8859-1");//丟失字元 byte[] bytes2 = s.getBytes("GBK"); byte[] bytes3 = s.getBytes("UTF-8");
4. 位元組轉字元串
String s1 = new String(bytes1,"utf-8");//丟失 String s2 = new String(bytes2,"GBK"); String s3 = new String(bytes3,"utf-8");