javascript
Spring MVC Controller中返回json数据中文乱码处理
問題
在使用spring MVC Controller的過程中,發(fā)現(xiàn)返回到客戶端的的中文出現(xiàn)亂碼。后臺(tái)Java代碼:
解決
在produce參數(shù)中加入編碼聲明 charset=UTF-8
修改后的代碼為:
參考資料1:
springMVC返回json數(shù)據(jù)亂碼問題及@RequestMapping 詳解
一、@RequestMapping
RequestMapping是一個(gè)用來處理請(qǐng)求地址映射的注解,可用于類或方法上。用于類上,表示類中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑。
RequestMapping注解有六個(gè)屬性,下面我們把她分成三類進(jìn)行說明。
1、 value, method;
- value: 指定請(qǐng)求的實(shí)際地址,指定的地址可以是URI Template 模式(后面將會(huì)說明);
- method: 指定請(qǐng)求的method類型, GET、POST、PUT、DELETE等;
2、 consumes,produces;
- consumes: 指定處理請(qǐng)求的提交內(nèi)容類型(Content-Type),例如application/json, text/html;
- produces: 指定返回的內(nèi)容類型,僅當(dāng)request請(qǐng)求頭中的(Accept)類型中包含該指定類型才返回;
3、 params,headers;
- params: 指定request中必須包含某些參數(shù)值是,才讓該方法處理。
- headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請(qǐng)求。
二、json數(shù)據(jù)亂碼
在springMVC controller中返回json數(shù)據(jù)出現(xiàn)亂碼問題,因?yàn)闆]有進(jìn)行編碼,只需要簡單的注解就可以了。
在@RequestMapping()中加入produces=”text/html;charset=UTF-8”屬性即可,如下:
@RequestMapping(value="/respost",method=RequestMethod.GET,produces="text/html;charset=UTF-8") @ResponseBody public String postList(@RequestParam("topicId") String topicId){ List<Post> posts=new ArrayList<Post>(); System.out.println("topicId-----"+topicId); posts=postService.findPostList(topicId); JSONArray postJson=JSONArray.fromObject(posts); return postJson.toString(); }參考資料2:
三種方式解決你的js加載亂碼
第一種方式—編碼統(tǒng)一
我們以前覺得出現(xiàn)亂碼的原因是因?yàn)榫幋a不統(tǒng)一,就是因?yàn)槲覀冊(cè)O(shè)置編碼統(tǒng)一之后,就解決了問題,所以,讓html和js的編碼統(tǒng)一,是最簡單的一個(gè)亂碼解決方式,原因是什么,是因?yàn)?#xff0c;如果你在加載js的時(shí)候,并沒有聲明js的編碼格式,那么瀏覽器會(huì)默認(rèn)的按照當(dāng)前html的編碼格式進(jìn)行解析引入的js文件,如果你的js和本身頁面編碼不一樣,并且js中引入了中文字符,那么肯定會(huì)出現(xiàn)亂碼的。要知道,程序都是笨笨的。
第二種方式—在引入js的標(biāo)簽中加入charset屬性
這樣引入,那么這個(gè)xx.js就會(huì)以本身頁面的編碼進(jìn)行解析,而如果兩個(gè)的編碼不一樣,如果這個(gè)js是gbk的編碼,那么我們可以這樣寫
<script src="../../lib/Plugins/datepicker_lang_zh_CN.js" charset="utf-8" type="text/javascript"></script>那么,只要是保證這個(gè)js文件的確是gbk或者對(duì)應(yīng)的,你自己寫的編碼,那么無論在哪種編碼的頁面中引用這個(gè)js,都不會(huì)出現(xiàn)編碼問題,這樣寫才是最規(guī)范的,第一種方式會(huì)出現(xiàn)一種情況,就是有很少情況下,由于一些不規(guī)范的原因,我們會(huì)發(fā)現(xiàn)即使是編碼統(tǒng)一的時(shí)候,也會(huì)出現(xiàn)亂碼,那么我們最好就是用第二種方式來寫。
第三種方式—用服務(wù)器語言聲明header頭信息
這種方式是比較少見的一種方式,適合某些特定的情況。編碼信息都是在頭信息中聲明的。而js本身并沒有像html mate標(biāo)簽這樣的聲明頭信息的標(biāo)簽,所以要借助服務(wù)器語言,我是學(xué)php的,其header(“Content-Type:text/html;charset=gb2312″);就可以聲明頭信息,而如何寫這個(gè)js,就是把js內(nèi)容寫在php文件中,這里就有一個(gè)知識(shí)點(diǎn),就是js文件并不一定非寫在js為后綴的文件中,其實(shí)可以寫的服務(wù)器文件(php文件等)中,php以
<script type="text/jscript" charset="gbk" src="xx.php"></script>在這個(gè)xx.php寫
<? $ip = getenv('REMOTE_ADDR'); echo "alert($ip);"; ?>這樣我們?cè)L問這個(gè)html頁面,就會(huì)彈出ip地址,我們就可以對(duì)他進(jìn)行其他操作等。當(dāng)然,既然是連接服務(wù)端文件,就不能是直接雙擊打開這個(gè)html了,一定是通過瀏覽器訪問才可以,或者是連接這個(gè)php文件的src要寫http形式,目的就是保證這個(gè)php文件要是通過服務(wù)器解析訪問的,如果你這樣寫相對(duì)目錄的形式連接php,你直接打開html,就相當(dāng)于直接打開了這個(gè)php文件,而不是通過http訪問的,這個(gè)php是不能被解析的。講的復(fù)雜了,但是這是一個(gè)很重要的知識(shí)點(diǎn)。如果單從亂碼而言,這種引用js文件的方式適合我們已經(jīng)引用了,不能再修改這個(gè)引用文件了,比如我們?cè)谝恍┩怄溦景l(fā)了文章,不能再修改了,那么,我們可以修改連接的我們網(wǎng)站上的這個(gè)js文件,當(dāng)前前提是,連接的是服務(wù)端文件,我們就可以通過這樣的方式解決。
總結(jié)
以上是生活随笔為你收集整理的Spring MVC Controller中返回json数据中文乱码处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Console来调试JS程序、Con
- 下一篇: 03-JavaScript