1. 程式人生 > >關於程式中亂碼解決方案下:亂碼解決篇

關於程式中亂碼解決方案下:亂碼解決篇

亂碼的種類有三種
         * 資料儲存之後的亂碼
         * 資料展示過程中的亂碼
         * 資料傳遞過程中的亂碼
6、關於資料儲存過程中的亂碼:
          * 資料儲存之後的亂碼: 資料最終儲存到資料庫表中的時候,表中的資料有亂碼現象。
          * 怎麼解決這個問題呢?
          - 先檢視在執行insert語句之前是否是亂碼,如果是亂碼,先解決儲存之前的亂碼問題。
          - 執行insert語句之前不是亂碼,儲存之後出現亂碼,那可能是資料庫表本身不支援簡體中文。
7、資料展示過程中的亂碼?
         * 伺服器端的程式響應中文到瀏覽器,出現亂碼:
         response.setContentType("text/html;charset=UTF-8"); 為什麼編寫UTF-8呢?
                    out.print("中文");  
         工作區的編碼方式採用UTF-8,說明這裡的“中文”這兩個字也是採用UTF-8的編碼方式,
         這時採用charset=UTF-8的方式響應到瀏覽器上,不會出現亂碼。

         工作區的編碼方式採用GBK,說明這裡的“中文”這兩個字也是採用GBK的編碼方式,
         應該編寫這樣的程式碼不會出現中文亂碼:
                 response.setContentType("text/html;charset=GBK");
          * 在myeclipse中編寫html檔案,假設工作區現在使用的是UTF-8的編碼方式,並且在html檔案中並沒有編寫:<meta charset="UTF-8">
         此時,瀏覽器訪問該html頁面的時候,中文出現亂碼,因為瀏覽器在簡體中文的作業系統當中,瀏覽器預設採用GBK的方式展示HTML頁面。怎麼解決這個問題,包括兩種
方式:
         第一種方式:將工作區的字元編碼方式設定為GBK
         第二種方式:在HTML檔案當中新增:<meta charset="UTF-8">
8、資料傳遞過程中的亂碼?
         * 資料傳遞過程中的亂碼:瀏覽器上的表單中的資料提交給伺服器之後,在伺服器端獲取表單中資料的時候出現中文亂碼問題。
         Browser --(傳遞過程中出現亂碼)-> Server

         * 為什麼瀏覽器向web伺服器提交中文的時候,在伺服器端獲取到的中文是亂碼呢?
         - 瀏覽器向伺服器提交中文的時候,中文是不能直接在網路中傳送的。首先被ISO-8859-1進行編碼,在網路中傳送的是一串經過ISO-8859-1編碼之後的資料,傳送給伺服器端之後,伺服器將這一段ISO-8859-1編碼的資料拿到,但是不知道該這段資料編碼之前是哪個國家的文字,所以無法正常顯示資料。

怎麼解決這個資料傳遞過程中的亂碼問題?
第一種解決方案:萬能解決方案
        假設現在在瀏覽器上使用的編碼方式是UTF-8,在表單中編寫了“張三”漢字,此時的“張三”漢字是採用UTF-8的編碼方式。
        提交表單會先將UTF-8編碼方式的“張三”轉換成ISO-8859-1編碼方式的“張三”
        傳送給伺服器,伺服器接收到之後,先經過"ISO-8859-1"的編碼方式進行“解碼”還原,
        還原之後再通過UTF-8的編碼方式進行重新編碼。
                String username = request.getParameter("username");
                byte[] bytes = username.getBytes("ISO-8859-1"); //解碼
                username = new String(bytes,"UTF-8"); //編碼
                            UTF-8 --> ISO-8859-1 --> UTF-8
        以上的UTF-8是可變的,以瀏覽器上使用的編碼方式為準。
第二種解決方案:專門解決POST請求的中文亂碼

         * 無框架下編寫

        request.setCharacterEncoding(????);

                      ??? 這個位置寫什麼:寫瀏覽器的編碼方式。

        另外以上的程式碼只對請求體進行編碼,不對請求行中的資料編碼,所以不能解決GET請求的亂碼問題。

        另外以上程式碼必須在從request物件中獲取資料之前設定有效。

         * 框架下編寫

        在WEB-INF檔案下配置過濾器

<!-- 表單提交POST中文亂碼解決方案統一字元編碼為UTF-8 -->
	<filter>
		<filter-name>characterEncodingFilter</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>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
     <url-pattern>/*</url-pattern> 會匹配所有url:路徑型的和字尾型的url(包括/login,*.jsp,*.js和*.html等)</span>

第三種解決方案:專門解決GET請求的中文亂碼

        修改CATALINA_HOME/conf/server.xml檔案:
                <Connector port="8080" protocol="HTTP/1.1"
                             connectionTimeout="20000"
                             redirectPort="8443"
                             URIEncoding="UTF-8"
                             maxThreads="200"/>
        注意:這裡的編碼方式UTF-8也不能隨意編寫,需要和瀏覽器的編碼方式一致。
        另外:Connector標籤中可以配置什麼資訊呢?
                     * 埠號    URI字元編碼方式     執行緒數量   .....
         一個web站點的預設埠號是:80埠,80埠在一個url中可以不寫,預設就是80
         以上的編寫參考文件:CATALINA_HOME/webapps/docs/config/http.html(我的:E:/tomcat7/webapps/docs/config/http.html)
         Tomcat伺服器底層在實現的時候,預設情況下可支援同時200個執行緒併發,WEB伺服器底層為了提高程式的執行效率,一般都提供了執行緒池技術(Thread Pool)。使用者在訪問的時候,實際上不會new執行緒,實際上是在伺服器啟動階段就提前將執行緒new好了,放到執行緒池當中。
<pre name="code" class="html">import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DemoServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {		
		//不能解決get請求亂碼
		//request.setCharacterEncoding("UTF-8");		
		String username = request.getParameter("username");
		System.out.println(username);		
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {		
		/*
		//萬能解決方案,適應GET和POST請求。但是這種解決方案編寫程式碼太多。比較麻煩。
		//獲取使用者名稱
		String username = request.getParameter("username");
		byte[] bytes = username.getBytes("ISO-8859-1");
		username = new String(bytes,"UTF-8");
		System.out.println(username);
		*/		
		//有效
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");
		//無效
		//request.setCharacterEncoding("UTF-8");
		System.out.println(username);
	}
}


                    圖1    CATALINA_HOME/webapps/docs/config/http.html頁面
9、怎麼保證不出現亂碼?

只能說是儘量避免出現亂碼,在專案開發過程中統一採用統一編碼方式,凡是涉及到編碼方式的統一都用UTF-8.

希望對你有幫助,祝你有一個好心情,加油!