java web編解碼問題

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將按頁面默認字符集編碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章