1. 關於java中 get提交方式的亂碼問題。
這個原因是伺服器導致的,伺服器比如tomcat接收get方法默認使用的是ISO-8859-1編碼,而瀏覽器發送時文字編碼是和頁面編碼保持一致的,如果頁面是使用utf-8 編碼 get方法文字自然是使用utf-8編碼,但接收伺服器沒有設置的情況下用了ISO-8859-1編碼接收,中文自然就成亂碼了,不過由於ISO-8859-1編碼是單位元組編碼所以我們可以使用getBytes("ISO-8859-1"),"utf-8"這樣把文字重新轉換成utf-8 編碼。
第一個發送的文字是utf-8編碼 而tomcat接收後用錯誤的ISO-8859-1編碼了,這樣getBytes("ISO-8859-1")後會重新得到正確的utf-8編碼的位元組數組 ,然後用 new
String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8")重新將位元組編碼成UTF-8編碼的文字這樣文字就正確了。
如果是tomcat的話 server.xml文件里
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
後邊的URIEncoding就是設置get方法編碼的如果沒有指定URL接收的編碼類型,自動會用ISO-8859-1編碼
2. 地址欄中有漢字,java如何利用對url編碼求解
地址欄中出現漢字的情況有兩種,一種是漢字出現在URL的路徑部分,一種是漢字出現在URL的傳參的部分,第二種情況的時候必須採用編碼後傳參,接受時解碼的方式完成傳參。js中編碼有escape(),encodeURI(),encodeURIComponent()三個常用的方法,escape()常常用在提交頁面和處理頁面的編碼格式相同的情況下(比如它們都是GB2312),encodeURI()和encodeURIComponent()的用法基本相同,區別在於encodeURIComponent()也對"?"等特殊字元進行編碼。
一開始遇到中文參數的時候,使用encodeURI()進行了一遍編碼,傳過去後,發現解碼出現問題,於是想到可能是編碼方法使用錯誤,於是使用escape()方法,這時發現解碼時拋出isHexDigit異常。藉助網路搜索isHexDigit異常,
發現原來,是escape()方法造成了異常,同時了解了瀏覽器傳遞地址的一些原理,在瀏覽器地址欄里,瀏覽器認為%是個轉義字元,瀏覽器會把%與%之間的編碼,兩位兩位取出後進行解碼,然後再傳遞給處理頁面,
然後由處理頁面進行再次解碼。由此我想到一直使用encodeURI方法是正確的,只是需要使用兩次encodeURI方法,例如encodeURI(encodeURI("中文"));第一次是把中文編碼成%xy的格式,
第二次是對%xy中的%進行編碼,%編碼成%25。整個傳參過程大體應該是:提交頁面使用encodeURI(encodeURI("中文"))編碼,把最後的編碼結果%25xy傳遞給處理頁面的過程中,瀏覽器獲取URL地址
(注意openModelDialog方法,瀏覽器獲取不到參數編碼)後解碼成%xy,然後把%xy傳遞給處理頁面,處理頁面使用URLDecoder.decode(request.getParameter("參數名"),"UTF-8");完成解碼。
總結:1、漢字出現在URL路徑部分的時候不需要編碼解碼;