標籤:方式 無法 部署 tin 輸出 coder inf 百度搜 參數
估計很多人在做web開發的時候,都會碰到過url傳遞中文參數,有時候會出現亂碼的問題,但有些項目或者環境,又不會有問題。當遇到亂碼的時候,上網找了很多解決方案,比如:
- 版面設定它的編碼方式,改成utf-8 或者gb2312。
encodeURI(url),也有人說要2個encodeURI,如:window.location.href = encodeURI(‘b.html?cId=‘+id+"&cName="+encodeURIComponent(name));
然後後台String str = java.net.URLDecoder.decode(str, "UTF-8");這樣進行轉碼等。
解決方案就不一一列舉了,大家可自行百度搜尋,我也搞不清楚究竟怎麼能保證百分百解決問題。
項目中碰到的情況是,開發環境經過上述的2種方法,折騰過,確實能定位某個編碼轉換是正常的。
但部署到測試環境調試輸出後發現,無論是gbk,utf8,iso等等編碼測試,都無法正常還原中文字串。
於是想到了另外一種方法,就是把中文轉換為數字或者是英文字母以及標點符號等組成的字串傳遞到後台,
因此有想法是把字串加密為base64的方式傳過去後,再後台再進行解密。上網找了下,沒找到現成的有效方法,於是放棄了。
再後來,想著不需要加密了,直接把字串轉換成16進位傳遞到後台,再把它轉回來吧,於是,這個終極的解決方案就出來了。
首先是jsp頁面中增加指令碼,把字串轉換成16進位字串,字元之間用,號隔開,不隔開,無法區分出哪個是半形哪個是全形(如果不用,號隔開的,麻煩請提供個好的解決方案,謝謝)
function stringToHex(str){var val="";for(var i = 0; i < str.length; i++){if(val == "")val = str.charCodeAt(i).toString(16);elseval += "," + str.charCodeAt(i).toString(16);}return val;}
頁面上把字串經過該函數轉換後,傳遞到後台,如:
var code_value=stringToHex(PrjName);
var url= "/assets/fmProjectInfo.do?method=synCheckProjectName&prjName="+code_value+"&typeId=<bean:write name="fmProjectInfoForm" property="bo.ftId"/>"
背景轉碼為:
public static String decode(String unicodeStr) { if (unicodeStr == null) { return null; } StringBuffer retBuf = new StringBuffer(); int maxLoop = unicodeStr.length(); for (int i = 0; i < maxLoop; i++) { if (unicodeStr.charAt(i) == ‘\\‘) { if ((i < maxLoop - 5) && ((unicodeStr.charAt(i + 1) == ‘u‘) || (unicodeStr .charAt(i + 1) == ‘U‘))) try { retBuf.append((char) Integer.parseInt( unicodeStr.substring(i + 2, i + 6), 16)); i += 5; } catch (NumberFormatException localNumberFormatException) { retBuf.append(unicodeStr.charAt(i)); } else retBuf.append(unicodeStr.charAt(i)); } else { retBuf.append(unicodeStr.charAt(i)); } } return retBuf.toString(); } //把jsp頁面傳遞進來的,用,號隔開的16進位字串轉換成 類似:select \u7528\u6237\u540d from \u7528\u6237 的字串,在調用decode方法把中文轉換出來。 public static String jspStrInit(String sourceStr) { String[] sourceStrArray = sourceStr.split(","); StringBuffer sb=new StringBuffer(); for (int i = 0; i < sourceStrArray.length; i++) { if (sourceStrArray[i].length()<=2) sb.append(hexStr2Str(sourceStrArray[i].toUpperCase())); else sb.append("\\u"+sourceStrArray[i]); } return sb.toString(); } public static String jspDecode(String unicodeStr) { String mStr=jspStrInit(unicodeStr); return decode(mStr); } public static void main(String[] args) throws Exception { String bb="5e02,91cd,70b9,5de5,4f5c,6d4b,8bd5"; String cc=jspDecode(bb); System.out.println(cc); }
jspDecode這個方法就是把jsp頁面傳遞過來的字串進行還原的。該終極解決方案就此結束。
最後,在另外一個項目中有客戶的研發保障,說修改意見那裡有時候儲存不成功,有時候又沒問題,經過分析,修改意見那裡是使用ajax封裝了json的資料傳遞到後台進行更新的。
由於意見裡麵包含了斷行符號,標點符號等特殊符號,違反了json的原則導致的,我給他提供的解決方案,也是採用了該方案,讓他把該意見轉換為16進位字串之後,傳遞到後台再轉換回來去解決。
目前還沒得到問題的解決回覆,但按理,應該也可以用在該情境裡面。
原創作品出自努力偷懶,轉載請說明文章出處:http://blog.csdn.net/kfarvid或 http://www.cnblogs.com/kfarvid/
url 傳遞中文參數亂碼問題的終極解決方案。