解決表單get提交亂碼問題

解決表單get提交亂碼問題

客戶端提交數據到服務有兩種方式GET和POST
1.get方式
數據直接在url上進行拼接,使用&分隔key-value對.
但有時key,value會出現中文等對於html標準來說不安全的字符
html標準說
除了字符”a”-”z”,”A”-”Z”,”0″-”9″,”.”,”-”,”*”,和”_” 其他的字符都是不安全的,需要進行編碼.其中” “空格會被編碼成+號
當出現不安全字符時,在發送到服務器之前,瀏覽器會將這些參數值進行編碼,一般推薦是使用utf-8編碼格式.
字符被轉換爲1個或者多個字節,然後每個字節都被表示成”%xy”格式的由3個字符組成的字符串,xy是字節的2位16進制的表示.
也可以使用javascript對數據進行encodeURIComponent(url);
現在的url就成了ASCII範圍內的字符了,然後以iso-8859-1的編碼方式轉換成二進制隨着請求頭一起發送出去,對於get方法來說,沒有請求實體,含有數據的url都在請求頭裏面
請注意,其實這裏進行了兩次編碼,第一次是使用UTF8,第二次使用iso-8859-1編碼成能在網絡上傳輸二進制101010….
現在問題來到了服務器端,每種服務器默認的編碼方式都可能不同,比如tomcat默認編碼就是iso-8859-1, 而resin默認編碼是utf-8
按道理服務器端也會做兩次的解碼動作,第一次是對二進制內容的iso-8859-1的解碼,第二次是使用服務器默認的編碼對數據進行解碼,
因此我們使用request.getParameter(“name”)得到的數據是經過兩次解碼的.
當tomcat使用iso-8859-1對數據進行第二次解碼時,因爲對應客戶端編碼是utf8,
因此我們使用request.getParameter(“name”)就肯定亂碼.
如果我們不去改變tomcat的默認編碼,可以使用
new String(request.getParameter(“name”).getBytes(“iso-8859-1″), “utf-8″);手工重新解碼.
request.setCharacterEncoding(“utf-8″)這種方式對於get方式提交數據是無效的,
但是對post方式提交數據卻是有效的.因爲get沒有request body.

通常的做法還是修改tomcat的默認編碼:
在server.xml中的connector加上URIEncoding=”UTF-8″即可

2.post方式
post方式提交的數據也是必須進行編碼的.
如果form所在html文件指定了編碼,就使用那個編碼進行url編碼.

總結:爲了防止出現亂碼,一般系統相關的文件都設成utf8格式,web服務器,java服務器,數據庫的編碼格式都設爲utf8.這樣一般比較少出現亂碼問題.
還有就是儘量使用post方式提交數據,一個是因爲url的長度是有限制的,而get方式是將數據拼接到url上的.

This entry was posted in 問題與解決. Bookmark the permalink.


轉載自:http://www.jsper.org/%E8%A7%A3%E5%86%B3%E8%A1%A8%E5%8D%95get%E6%8F%90%E4%BA%A4%E4%B9%B1%E7%A0%81%E9%97%AE%E9%A2%98/

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