J2EE (六) 詳解 java 中文亂碼

  
  1. 簡介
    1. Java項目的開發過程當中,常常會出現中文亂碼的狀況,這也是一直是困擾你們的一個問題,不少的程序員都會常常遇到這個問題。
    2. 有時搗鼓調試半天也摸不着頭緒,不知道究竟哪裏出了問題,那是你還不清楚出現這種亂碼的起因。
    1. 下面爲你們簡單介紹一下有關常見的Java中文亂碼以及相應的解決方法,讓咱們在之後的開發中再遇到亂碼知道怎麼處理,對症下藥。
  2. J2EE程序分析
    1. 從事Java的人都知道Java項目是由容器管理(Tomcat)來管理的,項目中的各種文件如JSP/Servlet/JAVA/CLASS的初始化、對象建立、回收、編譯、運行等都是由容器來統一管理,所以,在Java內部能夠由容器來統一設置字符集編碼方式,這樣Java自己的編碼便可統一,而亂碼每每不是出如今內部,而是Java在與外界交互、打交道的過程當中,因爲內外字符集編碼方式不同才致使的亂碼,那麼Tomcat主要與哪些外部交互呢?
    2. 在上面說了能夠經過設置容器的編碼方式改變Java的編碼,那麼在沒有 部署到容器中以前怎麼編碼,它的各類運算中只要涉及到編碼問題都會自動轉化爲unicode編碼,而在沒有轉化爲unicode以前是採用操做系統的默認編碼,這也是Java能夠跨平臺的一個緣由。
    1. Java進行直接交互的每每是瀏覽器、數據庫等,Java的輸入、輸出也是和它們打交道,統一Java系統的輸入、輸出編碼方式是解決亂碼問題的原理。
  3. 中文亂碼產生緣由以及解決
    1. JavaJSP文件編譯
      1. 首先Java(包括JSP)源文件中極可能包含有中文,而Java和JSP源文件的保存方式是基於字節流的,若是Java和JSP編譯成class文件過程當中,使用的編碼方式與源文件的編碼不一致,就會出現亂碼。
      2. 解決方法(經常使用)
        1. <%@ page language="java" contentType="text/html; charset=GB18030"
              pageEncoding="GB18030"%>

    1. Java與其它軟件交互
      1. Java同瀏覽器、數據庫、文件、頁面等傳遞數據時,須要發生字節與字符之間得轉換,Java字符與其它字節之間相互轉換,若是在以上轉換過程當中使用的編碼方式與字節原有的編碼不一致,極可能就會出現亂碼。
      1. JSP與頁面參數之間的亂碼
        1. 獲取頁面參數時通常採用系統默認的編碼方式,若是頁面參數的編碼類型和系統默認的編碼類型不一致,極可能就會出現亂碼。解決這類亂碼問題的基本方法是在頁面獲取參數以前,強制指定request獲取參數的編碼方式:
          1. request.setCharacterEncoding("GB18030")

        2. 若是在JSP將變量輸出到頁面時出現了亂碼,能夠經過設置
          1. 代碼
            response.setContentType("text/html;charset=GBK")
            

          2. 若是咱們的JSP文件過多,一個一個的設置是很麻煩的,則咱們能夠在配置文件裏面設置,以下:
          3. <!--過濾器配置--> 
              <filter>
              	<filter-name>CharSetEncodingFilter</filter-name>
              	<filter-class>com.bjpowernode.drp.util.filter.CharSetEncodingFilter</filter-class>
              	<init-param>
              		<param-name>encoding</param-name>
              		<param-value>GB18030</param-value>
              	</init-param>
              </filter>
              
              <filter-mapping>
              	<filter-name>CharSetEncodingFilter</filter-name>
              	<url-pattern>*.jsp</url-pattern>
              </filter-mapping> 
              <filter-mapping>  
              	<filter-name>CharSetEncodingFilter</filter-name>
              	<url-pattern>/servlet/*</url-pattern>
              </filter-mapping> 

                              3.在DRP中,從Servlet往JSP傳參的過程當中始終出現亂碼,利用URLEncoder.encode(),編碼後仍出現亂碼,代碼以下:html

                                   a.在Servlet中利用Response.sendRedirect()進行重定向java

	                   //重定向到物料首頁
		             response.sendRedirect(request.getContextPath()+"/basedata/item_maint.jsp?
                          errorMessage="+java.net.URLEncoder.encode(message,"GB18030"));

                                   b.JSP中接受參數node

                                         將字符轉爲字節程序員

                            new String(request.getParameter("errorMessage").getBytes("8859_1"),"GB18030")
  1. Java與數據庫之間的亂碼
    1. 大部分數據庫都支持以unicode編碼方式,因此解決Java與數據庫之間的亂碼問題比較明智的方式是直接使用unicode編碼與數據庫交互。
  2. Java與文件/流之間的亂碼
    1. Java讀寫文件最經常使用的類是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基於字節流的,經常使用於讀寫二進制文件。讀寫字符文件建議使用基於字符的FileReader和FileWriter,省去了字節與字符之間的轉換。但這兩個類的構造函數默認使用系統的編碼方式,若是文件內容與系統編碼方式不一致,可能會出現亂碼。
    2. InputStreamReader/OutputStreamWriter,它們也是基於字符的,但在構造函數中能夠指定編碼類型
    3. InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。
      

            iiv. 總結數據庫

    1. 只有知道問題產生的緣由,才能很快找到解決方法,出現了問題不是簡單的從網上找找怎麼作,而後,按照別人說的步驟進行簡單設置設置,就把遇到的問題弄好了,若是不知道緣由,等下次出現的時候,雖然仍是一樣的問題,你也照樣不會,只是按着別人說的去作,去模仿永遠是別人的東西,若是想變成本身的,就要本身去作。
相關文章
相關標籤/搜索