Ajax以POST方式提交,url形式為”url?param=xx¶m2=xx”時,如果傳遞的參數是中文或日文,後台接收參數將出現亂碼,疑似“灝?浼??ㄨ??rdquo;。此時我們需要將url編碼成UTF-8。調用javascript方法encodeURI(URIstring),後台接收參數調用URLDecoder.decode(String s,String enc) 解碼。
工作中遇到這個問題,起初打算用反射迴圈給屬性轉碼,考慮到反射效率問題,為避免濫用反射。於是想到BeanUtils工具包賦值前能不能自訂動作呢?還真行。下面給出工作中遇到的執行個體,頁面通過jQuery序列化所有表單使之成為url參數形式字串,通過Ajax提交。後台Struts封裝的FormBean取得所有參數值,調用BeanUtils工具包copyProperties(Object dest, Object orig)方法將FormBean複製到ValueBean,在複製對象屬性之前,自訂String編碼轉換器,轉換器中通過URLDecoder.decode(String s,String enc)對Value進行轉碼。對象的所有屬性將會通過自訂轉換器過濾轉碼成中文。
解決此問題的方法非常簡單,只需要在JS處理參數時用escape()函數處理一下即可,而且不需要再用unescape()解碼,這個方法適合POST和GET方式,具體的Ajax代碼這裡我不例出,這裡給出用escape()函數處理參數時的代碼:
代碼如下 |
複製代碼 |
var htmer ="getcode="+escape(getcode)+"&Content="+escape(Content); |
通常我們在處理Ajax的時候會在這裡直接擷取參數的值,為了使中文參數不是亂碼,我們只需要用escape()函數對參數處理下即可。
問題二
當網站頁面不是utf-8編碼時,ajax提交的中文便會變成亂碼,解決方案如下:
找到jquery.js裡的
代碼如下 |
複製代碼 |
contentType:application/x-www-form-urlencoded 將它改成 contentType:application/x-www-form-urlencoded; charset=UTF-8 |
就可以了。原因:未指定charset時,jquery使用ISO-8859-1,ISO8859-1,通常叫做Latin-1。Latin-1包括了書寫所有西方歐洲語言不可缺少的附加字元。jquery的ajax根本沒有考慮到國際化的問題,而使用了歐洲的字元集,所以傳遞中文時才會出現亂碼。
例子
js的ajax
代碼如下 |
複製代碼 |
if(confirm("確定儲存嗎?")){ var url = "xxAction.do?method=xxMethod"; var data = $("form:first").serialize(); data = encodeURI(data); // 提交資料URL通過encodeURI(URIstring)編碼 $.ajax({ type:"POST", url:url, data:data, success:function(msg){ alert(msg); } }); } |
背景程式
代碼如下 |
複製代碼 |
private void formBeanToValueBean(ZmxgzzmsyVB vb, ZmxgzzmsyFB fb) throws Exception { // 自訂轉換String編碼轉換器 ConvertUtils.register(new Converter() { public Object convert(Class type, Object value) { if (value == null) { return null; } else { String val = ""; try { // 通過URLDecoder.decode(String s,String enc)解碼 val = URLDecoder.decode(value.toString(), "UTF-8"); } catch (Exception e) { e.printStackTrace(); } return val; } } }, String.class); BeanUtils.copyProperties(vb, fb); ConvertUtils.deregister(); } |