1. 程式人生 > >前後端資料互動中文亂碼問題彙總大全

前後端資料互動中文亂碼問題彙總大全

PS→無奈:有志者自有千計萬計,無志者只感千難萬難。

相信大家在請求的過程中或多或少的都遇到過請求中文亂碼的問題把,我也不例外,網上解決中文亂碼的辦法一大堆,但是昨天碰到的讓我試了很多很多方法都解決不了,最終找到解決方案,特此記錄一下。
本人採用的是ajax請求:

$.ajax({
		url:url,
		data:data,
		type:'post',
        // scriptCharset: 'utf-8',
		success:function(msg){
		var survey=eval("("+msg+")");
		$("#myDialogRoot input[name='effective'][value='"+survey.surveyDetail.effective+"']").attr("checked",true);
		$("#myDialogRoot input[name='effectiveIp'][value='"+survey.surveyDetail.effectiveIp+"']").attr("checked",true);
		$("#myDialogRoot input[name='rule'][value='"+survey.surveyDetail.rule+"']").attr("checked",true);
		$("#myDialogRoot input[name='ruleCode']").val(survey.surveyDetail.ruleCode);
		$("#myDialogRoot input[name='refresh'][value='"+survey.surveyDetail.refresh+"']").attr("checked",true);
		$("#myDialogRoot input[name='mailOnly'][value='"+survey.surveyDetail.mailOnly+"']").attr("checked",true);
		$("#myDialogRoot input[name='ynEndNum'][value='"+survey.surveyDetail.ynEndNum+"']").attr("checked",true);
		$("#myDialogRoot input[name='endNum']").val(survey.surveyDetail.endNum);
		$("#myDialogRoot input[name='ynEndTime'][value='"+survey.surveyDetail.ynEndTime+"']").attr("checked",true);
		if(survey.surveyDetail.endTime!="null"){
		    $("#myDialogRoot input[name='endTime']").val(survey.surveyDetail.endTime);
		}
		$("#myDialogRoot input[name='showShareSurvey'][value='"+survey.surveyDetail.showShareSurvey+"']").attr("checked",true);
		$("#myDialogRoot input[name='showAnswerDa'][value='"+survey.surveyDetail.showAnswerDa+"']").attr("checked",true);				
		}
	});

試過很多方式,後臺最終解決方式,就只此一句話:

 @ResponseBody
    @RequestMapping(value = "/my-survey!attrs")
    public String attrs(@RequestParam("id")String id) throws Exception {
        HttpServletResponse response=SpringUtils.getResponse();
//        response.setContentType("text/javascript;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        String result="";
        try{
            SurveyDirectory survey=surveyDirectoryManager.getSurvey(id);
            JsonConfig cfg = new JsonConfig();
            cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
            cfg.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor());
            JSONObject jsonObject=JSONObject.fromObject(survey,cfg);
            response.getWriter().println(jsonObject.toString());
            result=jsonObject.toString();
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

網上所說方法有以下幾種,在此彙總記錄一筆:

1.Controller響應方法中已經設定了編碼格式

response.setContentType("text/html;charset=UTF-8");

JSONObject jsonObject = new JSONObject();

PrintWriter out = response.getWriter();

頁面頭部也設定了一致(utf-8)的編碼格式

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

然而頁面仍然會亂碼。

 解決辦法:

在Ajax方法中設定編碼格式:

scriptCharset: 'utf-8'

2.//在ajax請求時候設定編碼:

contentType: "application/x-www-form-urlencoded; charset=utf-8"

3.在後臺的請求對映路徑後面加上produces屬性:

@RequestMapping(value = "***",produces={"text/html;charset=UTF-8;","application/json;"}) 

4.前臺js將引數值轉為統一資源標示符(URI)

例如name = encodeURI(encodeURI(‘張三'));注意要encodeURI兩次。
後臺需要對URI進行解析
String name= request.getParameter(“name”);
name= URLDecoder.decode(name, “UTF-8″);

5.在後臺response加上這兩句:

  1. request.setCharacterEncoding("UTF-8");  
  2.         response.setContentType("text/html;charset=UTF-8");

本人以上5種情況都試過,要麼返回仍是亂碼,要麼返回不亂碼,但是前端接收到資料無任何反應,至此本人試了很多遍,發現本人所用框架只能用一種方式才能解決,就是在後臺response處加上一句,只能一句,不然前段會報返回資料格式錯誤等資訊。
本人最終解決方案:

response.setCharacterEncoding("UTF-8");  // 僅此一句便可解決問題,加別的不行,用別的也不行。