JavaWeb處理GET、POST時的編碼亂碼問題


對於GET方法,只要設置了res.setContentType("text/html;charset=UTF-8"), req.getParameter()就不會產生亂碼。

對於POST方法,req.getQueryString()會返回null, req.getParameter()會產生亂碼

需要用new String(req.getParameter("e").getBytes("iso-8859-1"), "utf-8")來得到正確的編碼。

測試代碼如下:

out.println("req.getParameter(\"e\"):"+req.getParameter("e")+"</br>");
out.println("req.getParameter(\"e\"):"+new String(req.getParameter("e").getBytes("iso-8859-1"), "utf-8")+"</br>");
out.println("java.net.URLEncoder.encode(\"叫苦連天二胎\", \"utf-8\"):"+"</br>"+java.net.URLEncoder.encode("叫苦連天二胎", "utf-8")+"</br>");
byte[] bs = req.getParameter("e").getBytes("iso-8859-1");
for (byte b: bs) {
   out.print("%"+Integer.toHexString(0x000000ff&b).toUpperCase());
}
out.println("</br>");

  

瀏覽器顯示結果:

 根據

java.net.URLEncoder.encode("叫苦連天二胎", "utf-8")

 的輸出結果

%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E

java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "iso-8859-1")

的輸出結果

叫苦连天二胎

對比可以看到,瀏覽器發送get、post請求時根據網頁設定的編碼將字符轉化問網頁的編碼用%分隔,在本例中是UTF-8編碼每個字節用一個%分隔。

例如, 叫苦連天二胎 的編碼的 E58FABE88BA6E8BF9EE5A4A9E4BA8CE8838E ,每個字節前面加上一個%就變成了

%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E

而tomcat收到GET請求時,直接用req.getParameter("e")時內部會使用 java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "utf-8") 會獲得正確的字符 叫苦連天二胎 。

對於POST請求,直接用req.getParameter("e")會得到亂碼 å«è‹¦è¿žå¤©äºŒèƒŽ ,因為tomcat內部會使用 java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "iso-8859-1") 從而得到錯誤的 å«è‹¦è¿žå¤©äºŒèƒŽ 。此時我也應該使用先使用 java.net.URLEncoder.encode(req.getParameter("e"),"iso-8859-1") 把 å«è‹¦è¿žå¤©äºŒèƒŽ 還原成 %E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E 然后再使用 java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "utf-8") 解碼即可得到正確的字符 叫苦連天二胎 ,代碼如下:

java.net.URLDecoder.decode(java.net.URLEncoder.encode(req.getParameter("e"),"iso-8859-1"), "utf-8")

 

即可得到正確的結果。 如下圖:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM