有老鐵的項目出現個問題,就是用SpringMVC給前台返回一句話,是String類型的,然后前台接收到是亂碼。
然后以為是簡單的response的編碼問題,就在方法體中開始給response設置編碼,結果charset和ContentType都設置遍了,於事無補,看了下代碼中的方法體,突然想到這是用SpringMVC框架返回消息的,跟response沒多大關系啊,再怎么給response設置各種編碼和類型,最后還是SpringMVC給返回消息的,於是在瀏覽器看了下請求頭,發現亂碼消息的ContentType是text/plain,而charset居然是ISO-8895-1類型的,怪不得會出現亂碼。
於是開始搜索相關關鍵字,果然找到一篇帖子說SpringMVC默認就是ISO編碼,可以以修改源代碼的方式解決這個問題,於是打開源代碼一看,果然是ISO-8895-1,可是打開的class文件,無法修改,不太懂如何修改源代碼,自己寫一個一模一樣的包,類的方法試了一下就發現特別麻煩。
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
還有一種方法是在SpringMVC的配置文件中對text/plain做編碼配置,本以為這個方法肯定能成功,結果怎么配置配置都不管用,后來在別人的帖子中也看到有網友也是用這種方法做配置,不管用,看來這種方法不是特別通用,也許是我們的Spring或者SpringMVC的版本號不一樣或者怎么地,反正就是不管用,通通不管用。
<bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean>
還有這種配置方法:
<bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8" index="0"> </constructor-arg> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean>
最后在一個帖子中發現了一個大佬的解決方法,就是在方法體中加入一個produces參數,用這個參數對所需要改變的請求類型做編碼設置,成功了!!!示例代碼如下:
@RequestMapping(value="/testGarbled.do", produces="text/html;charset=UTF-8" ) @ResponseBody public String testGarbled(ModelMap modelMap) { return "中文亂碼"; }
總結一下,最后這種方法是最實用最簡單的方法,因為有時項目中用到text/plain的地方很少,其他的text/html類型的很少會出現亂碼,所以這個療效最快。
附上兩篇參考鏈接:
http://ask.csdn.net/questions/149031#answer_tab_upload
http://blog.csdn.net/yfisaboy/article/details/30059969
這兩篇文章的評論區對我解決這個問題也是特別有幫助的。