亂碼總結(持續更新)


總體分析

建議:先將本文中提到的走一遍,說不定亂碼就消失了

1 CharacterEncodingFilter 設置forceResponseEncoding為true導致亂碼

表現:CharacterEncodingFilter 設置forceResponseEncoding為true導致亂碼,並且只有在訪問靜態資源的時候亂碼,並且只是在通過tomcat導致亂碼,通過瀏覽器正常訪問文件沒有亂碼。靜態資源也已經注明了<meta charset="UTF-8">

答案:原因在tomcat

解決辦法

  1. apache-tomcat-9.0.34\conf\server.xml的第70行左右Connector標簽添加URIEncoding="UTF-8"👇

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="UTF-8"
               />
    
  2. \apache-tomcat-9.0.34\bin\catalina.bat的大概第216行,有關set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"修改為set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8

    set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8
    
  3. \apache-tomcat-9.0.34\conf\web.xml的第126行,對於DefaultServlet的配置,修改如下👇

    <servlet>
            <servlet-name>default</servlet-name>
            <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
            <init-param>
                <param-name>debug</param-name>
                <param-value>0</param-value>
            </init-param>
            <init-param>
            	<param-name>fileEncoding</param-name>
            	<param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>listings</param-name>
                <param-value>false</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    

2 tomcat控制太亂碼

表現:在運行tomcat的時候控制台亂碼

答案:tomcat的\apache-tomcat-8.5.54\conf\logging.properties里面配置的編碼格式和控制台不一樣,windows系統,win10下的idea默認控制台編碼gbk

解決方法

java.util.logging.ConsoleHandler.encoding = GBK

設置java.util.logging.ConsoleHandler.encoding和控制台編碼一致

3 springmvc前后端數據傳輸亂碼

表現:前后端的傳輸數據亂碼

原因:request和response的問題

解決方法

在項目web.xml配置監聽器,修改亂碼👇

<filter>
    <filter-name>filterForCharSet</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceRequestEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>forceResponseEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>filterForCharSet</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

4 @ResponseBody導致亂碼

表現:@ResponseBody返回的數據亂碼

原因:@ResponseBody亂碼原因👇

在spring處理ResponseBody時涉及到org.springframework.http.converter.StringHttpMessageConverter這個類,該類在默認實現中將defaultCharset設為ISO-8859-1。當@RequestMapping標記的方法未配置produces屬性時,將自動使用默認編碼;如果配置了produces屬性,AbstractHttpMessageConverter中的write方法將不會受supportedMediaTypes影響,而用produce設置的header賦值給contenttype。改造一下RequestMappingHandlerAdapter的配置,springMvc.xml如下:

注意:基於spring3.2以后的配置文件。編碼配置需要放在mvc:annotation-driven/之前,否則無效。

版權聲明:本文為CSDN博主「c.」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/cckevincyh/article/details/81227864

@ResponseBody亂碼問題解決

配置spring容器👇

<!--        @Response亂碼問題解決-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" >
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/plain;charset=utf-8</value>
                            <value>text/html;charset=UTF-8</value>
                            <value>applicaiton/*;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

其他解決辦法👉 https://blog.csdn.net/cckevincyh/article/details/81227864 https://www.cnblogs.com/zou-zou/p/9345485.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM