1. 瀏覽器編碼
瀏覽器是通過http協議與服務器交互,http的請求或響應報文格式如下:
(1)start line
(2)headers
(3)body
其中按規定,(1)、(2)必須是ASCII碼的字符,因此非ASCII碼的需要轉換成ASCII碼,分別介紹如下:
1)start line(起始行):其包含請求方法(post、get等)、URL、版本,在startline中需要注意的url,以如下url爲例
例:http://localhost:8080/servletTest/中文路徑?name=中文參數
其中:http://localhost:8080/servletTest/中文路徑爲pathInfo(路徑信息)
name=中文參數爲queryString(請求參數),爲滿足startline全爲ASCII字符,因此需要將pathInfo、queryString中中文字符先編碼成字節數組,然後以16進制形式展現,並在沒兩個字符前加上%(即urlcode)
對於pathinfo、queryString的編碼規則如下:
a. pathInfo的編碼受瀏覽器的編碼格式控制(chrome瀏覽器默認編碼格式爲utf-8)
b.queryString的編碼分不同情況:在瀏覽器中直接輸入,受瀏覽器的默認編碼格式控制(注:頁面內通過<a>等跳轉的也屬於瀏覽器直接輸入這種情況) 、在頁面內的get請求受頁面控制<meta charset="gbk">
2)headers:頭信息,如Accept-Charset等,其中可能會出現中文的有
1)get請求
http://localhost:8080/servletTest/中文路徑?name=中文參數
http://localhost:8080/servletTest/中文路徑:爲pathInfo(路徑信息)
name=中文參數:queryString(請求參數)
pathInfo的編碼受瀏覽器的編碼格式控制(瀏覽器默認編碼格式爲utf-8)
queryString的編碼分不同情況:a.在瀏覽器中直接輸入,受瀏覽器的默認編碼格式控制(注:頁面內通過<a>等跳轉的也屬於瀏覽器直接輸入這種情況) b.在頁面內的get請求受頁面控制<meta charset="gbk">
2)post請求
受頁面編碼格式限制<meta charset="gbk">
3)http head編碼
RFC 822規定head只能是ASCII編碼,因此存在如下兩種場景:
a. cookie中設置中文 b. 文件下載時指定中文文件名
對於上述兩種場景,均會出現亂碼問題,解決的方式是對其進行urlencode,然後再傳值
ps:urlencode編碼原理:用%加兩個字符表示一個16進製表示的字節,如%61 代表a
在js中常用的url編碼函數有:
escape :從Javascript 1.0引入,存在問題
encodeURI :對一個完整的URI進行編碼
encodeURIComponent :用作對URI的一個組件進行編碼,其保留字符少於encodeURI
4)js編碼
如果js代碼中含中文字符,則需要在引入時指定字符集
<script src="script .js" charset="utf-8"></script>
否則引入的js將按頁面默認字符集編碼