史上最全Servlet中的中文亂碼分析與解決問題

  在Servlet中接收瀏覽器的數據以及發送數據到瀏覽器的時候容易遇到一些中文顯示亂碼的問題,下面是博主對這類問題的一個總結,希望能幫到大家!

一、問題分析
  當我們的Servlet程序從客戶端接收到一箇中文數據或者發送一箇中文數據到服務器端的時候,默認情況下會顯示爲亂碼,這是由於編碼方式的不同造成的,tomcat從瀏覽器接收到數據時默認的編碼方式是ISO-8859-1的編碼格式,這個格式是單字節編碼,是不能解析中文的,而當數據接收到服務器的時候又沒有按照相同的編碼去解析數據,這就導致了中文亂碼問題的出現。(這裏實力吐槽一波中文在開發中的麻煩之處,不過也沒辦法,誰讓老外那幫哥們早期的編程技術比我們高哈哈哈)*
二、思維導圖
亂碼情況總結

  可以從思維導圖看到中文亂碼主要有兩種情況*

三、Request(HttpServletRequest)
3.1 GET方法
   HttpServletRequest是Servlet中用於接收客戶端請求的對象,我們可以用它的getParameter()方法來獲取客戶端的對象,例如獲取用戶在瀏覽器中輸入的姓名:

	String username=request.getParameter("username");

  當用戶在瀏覽器輸入中文的時候我們就會接收到亂碼,如下在這裏插入圖片描述
  當我們在寫頁面的時候定義的是如下語句:

 	<form action="CharacterTest" method="get">

  這時我們走的是我們定義的Servlet程序的doGet方法,所以這是在我們點擊提交的時候用戶輸入的中文就已經被解碼並跟在了url地址欄了,如下:
在這裏插入圖片描述
  這便導致了我們在後臺收到的數據是亂碼,這時候我們只需要在定義接收username的語句下面定義以下:

  username = new String(username.getBytes(“ISO-889-1”), “UTF-8”);

  下面是我的測試代碼:

String username = request.getParameter("username");
// 將拿到的有可能時字符串的數據在解碼一次,然後再按utf-8編碼
username = new String(username.getBytes("ISO-889-1"), "UTF-8");
System.out.println("username="+username );

  這樣我們在後臺接收到的語句就是正常的中文了,它的工作原理就是將數據按照ISO-8859-1的編碼去解碼轉換爲數組,再用UTF-8的方式加以編碼,因爲UTF-8支持中文編碼。
3.2 POST方法
  當我們再寫頁面的時候如果定義的是以post方式提交

    <form action="CharacterTest" method="post">

  那麼這時候點擊提交之後username的值便不會被拼接再url地址欄後面,所以它的中文亂碼解決方式和get方式的亂碼解決方法是不一樣的,具體的解決方法就是在接收username的語句前先提前定義好

    request.setCharacterEncoding("UTF-8");

具體的代碼示例如下:

private void postRequestTest(HttpServletRequest request) throws UnsupportedEncodingException {
		System.out.println("這次走的是post方式");
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println(username + "-----" + password);
	}

四、Response(HttpServletResponse)
   HttpServletResponse是Servlet中用於發送數據到用戶頁面,主要有兩種輸出方式,字符流response.getWriter().getWrite(); 和字節流response.getOutputStream().write();
4.1字符流中文亂碼
  當我們要返回中文給客戶端的時候,默認情況下會輸出中文亂碼:

	response.getWriter().write("你好");

  這時客戶端的頁面上會顯示如下:

在這裏插入圖片描述
這時我們的解決方式如下:

private void writerTest(HttpServletResponse response) throws IOException {
		// 測試字符流輸出中文
		//將數據以utf-8的方式編碼後發出去,tomcat默認的也是以utf-8的方式發出,所以下面方法裏面的utf-8省略也行
		response.setCharacterEncoding("UTF-8");
		//指定瀏覽器用什麼編碼解析服務器發出的數據
		response.setHeader("Content-Type", "text/html;charset=UTF-8");
		response.getWriter().write("你好");
	}

  這時瀏覽器就正常顯示出“你好”兩個字了。

4.1字節流中文亂碼
  這個方式是將數據以字節流的方式發送給客戶端,當我們要發送的數據不是純文本數據的時候就需要以字節流的方式輸出。以下還是以文本數據舉例,通過java特色鏈式調用的方法:

 response.getWriter().write("你好");

  同樣的默認情況下客戶端頁面上顯示的還是亂碼(再次吐槽中國人學編程的艱辛),解決方法如下:

// 測試字節流輸出中文
// 1.設置以utf-8的編碼格式將字符串轉換爲數組
response.getOutputStream().write("你好哦".getBytes("UTF-8"));
// 2.設置接收他的流浪器用什麼編碼解析這個文檔
response.setHeader("Content-Type", "text/html;charset=UTF-8");

這就是目前博主所知道的關於tomcat客戶端與服務器端之間通信時所產生的中文亂碼問題的解決方案。
如果有幫到你的話可以點個贊嗎^ 0 ^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章