URLEncoder和URLDecoder(乱码处理)
前言
在進行向服務器傳遞表單數據的實驗的時候,發現得到的英文字符正常而中文字符都是亂碼。在百思不得其解的時候,學習了一下URLEncoder和URLDecoder,以及順藤摸瓜找到了產生亂碼的原因和解決辦法,在此記錄一波。
URLEncoder和URLDecoder
URLEncoder和URLDecoder主要用完成普通字符和application/x-www-form-urlencodedMIME字符串之間的相互轉換,是HTML格式編碼的實用工具類。
轉換規則:
- 字母數字字符 “a” 到 “z”、“A” 到 “Z” 和 “0” 到 “9” 保持不變。
- .特殊字符 “.”、"-"、"*" 和 “_” 保持不變。
- 空格字符 " " 轉換為一個加號 “+”。
- 所有其他字符都是不安全的,因此首先使用一些編碼機制將它們轉換為一個或多個字節。然后每個字節用一個包含 3 個字符的字符串 “%xy” 表示,其中 xy 為該字節的兩位十六進制表示形式。推薦的編碼機制是 UTF-8。但是,出于兼容性考慮,如果未指定一種編碼,則使用相應平臺的默認編碼。
示例代碼
try {String url = "測試中文串";System.out.println(url);//通過utf-8編碼把中文字符串轉化為application/x-www-form-urlencodedMIME字符串String encodeUrl = URLEncoder.encode(url, "utf-8");System.out.println(encodeUrl);//同樣通過utf-8編碼把application/x-www-form-urlencodedMIME字符串解碼為原來的字符串String decodeUrl = URLDecoder.decode(encodeUrl, "utf-8");System.out.println(decodeUrl); } catch (Exception e) {e.printStackTrace(); }結果輸出
測試中文串 %E6%B5%8B%E8%AF%95%E4%B8%AD%E6%96%87%E4%B8%B2 測試中文串亂碼產生原因以及解決
亂碼產生原因:服務器端在調用request.getParameter(parameterName)獲取參數之前會自動通過"ISO8859-1"編碼對參數進行了一次解碼操作,相當于調用了一次 URLDecoder.decode(parameterValue, “ISO8859-1”)。在我們獲取到參數之后,又對獲取到的參數進行了一次解碼,于是出現了亂碼現象。相對于:
try {String url = "測試中文串";System.out.println(url);//經過編碼后得到application/x-www-form-urlencodedMIM*字符串String encodeUrl = URLEncoder.encode(url, "utf-8");System.out.println(encodeUrl);//服務器端自動進行的解碼操作encodeUrl = URLDecoder.decode(encodeUrl, "ISO8859-1"); System.out.println(encodeUrl);//我們獲取到參數的時候進行的操作String decodeUrl = URLDecoder.decode(encodeUrl, "utf-8");System.out.println(decodeUrl); } catch (Exception e) {e.printStackTrace(); }于是我們得到帶有亂碼的結果:
測試中文串 %E6%B5%8B%E8%AF%95%E4%B8%AD%E6%96%87%E4%B8%B2 ???è??????????? ???è???????????針對這種現象,這里提供了兩種解決方法:
方法一:利用String的構造函數進行轉碼(常用,推薦)
解決效果演示:
try {String url = "測試中文串";System.out.println(url);String encodeUrl = URLEncoder.encode(url, "utf-8");System.out.println(encodeUrl);//服務器端自動進行的解碼操作encodeUrl = URLDecoder.decode(encodeUrl, "ISO8859-1"); System.out.println(encodeUrl);//轉碼操作String decodeUrl = new String(encodeUrl.getBytes("ISO8859-1"), "utf-8");System.out.println(decodeUrl); } catch (Exception e) {e.printStackTrace(); }運行效果:
測試中文串 %E6%B5%8B%E8%AF%95%E4%B8%AD%E6%96%87%E4%B8%B2 ???è??????????? 測試中文串方法二:開始時對中文參數進行兩次”utf-8“編碼
這個方法同樣可以解決這個問題,由上文給出的規則可以知道,第二次編碼是對第一次編碼的到的串中的’%'進行編碼,雖然解碼的時候使用的是ISO-8859-1,但是對于%和字母數字而言用ISO-8859-1和UTF-8解碼出來的是一樣的,這樣經過服務器的自動解碼就可以得到第一次編碼得到的串。當我們獲取到參數再次用"utf-8"解碼的時候,就可以得到原來的中文字符串了。
//此部分不作演示
參考資料
總結
以上是生活随笔為你收集整理的URLEncoder和URLDecoder(乱码处理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA-11995(STL+模拟)附讲解
- 下一篇: Spring Boot实现简单的用户权限