1. 程式人生 > 其它 >JavaWeb基礎-Response物件響應的中文亂碼處理

JavaWeb基礎-Response物件響應的中文亂碼處理

技術標籤:Java基礎servlet亂碼response

Response物件響應的中文亂碼處理

使用位元組流響應中文

程式碼實現:

package ServletDemo;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /* Response響應中文的處理 */ public class ServletDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如果是GET請求就會執行doGet中的程式碼 //使用位元組流的方式輸出中文: ServletOutputStream outputStream =
resp.getOutputStream(); outputStream.write("中文".getBytes()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //如果是Post請求就會執行doPost中的程式碼 doGet(req, resp); } }

結果:
在這裡插入圖片描述
使用上述程式碼向頁面輸出中文時,不一定會有亂碼出現,因為這個亂碼的產生與中文轉成位元組陣列及瀏覽器開啟方式(開啟的時候採用的預設字符集)有關。

位元組流亂碼問題解決辦法:

將中文轉為位元組陣列的時候和瀏覽器預設開啟的時候採用的字符集一致即可。

package ServletDemo;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/*
Response響應中文的處理
 */
public class ServletDemo02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果是GET請求就會執行doGet中的程式碼
        //使用位元組流的方式輸出中文:
        ServletOutputStream outputStream = resp.getOutputStream();
        //設定瀏覽器預設開啟時採用的字符集
        resp.setHeader("Content-Type","text/html;charset=UTF-8");
        //設定中文轉成位元組陣列字符集編碼
        outputStream.write("中文".getBytes("UTF-8"));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果是Post請求就會執行doPost中的程式碼
        doGet(req, resp);
    }
}

使用字元流響應中文

程式碼實現:

package ServletDemo;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/*
Response響應中文的處理
 */
public class ServletDemo02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果是GET請求就會執行doGet中的程式碼
        resp.getWriter().println("中文!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果是Post請求就會執行doPost中的程式碼
        doGet(req, resp);
    }
}

結果:
在這裡插入圖片描述
使用上述程式碼肯定會出現中文亂碼的問題,因為字元流是有緩衝區的,response設計預設的緩衝區編碼是IOS-8859-1。這個字符集不支援中文。

字元流中文亂碼問題解決方法:

設定response獲得字元流緩衝區的編碼和設定瀏覽器預設開啟時候採用的字符集一致即可。
程式碼實現:

package ServletDemo;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/*
Response響應中文的處理
 */
public class ServletDemo02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果是GET請求就會執行doGet中的程式碼
        
        //設定瀏覽器預設開啟時採用的字符集
        //resp.setHeader("Content-Type","text/html;charset=UTF-8");
        //設定response獲得字元流緩衝區的編碼
        //resp.setCharacterEncoding("UTF-8");

        //也可用這句代替上面的兩句程式碼
        resp.setContentType("text/html;charset=UTF-8");

        resp.getWriter().println("中文!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果是Post請求就會執行doPost中的程式碼
        doGet(req, resp);
    }
}

結果:
在這裡插入圖片描述