解決表單get提交亂碼問題
客戶端提交數據到服務有兩種方式GET和POST1.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上的.
推薦閱讀:
※後期如何調整照片的曝光不足問題
※新刊 | 時空之謎:《星際穿越》中的科學問題
※白家醬壇 解密中醫 第六講 諾貝爾獎級別的經絡問題
※中華民族共有精神家園的主體性問題
※入冬水庫釣鯉,這些常見問題必須解決!
