JavaWeb基础-Response对象响应的中文乱码处理

本文详细介绍了在JavaWeb中使用Response对象处理中文乱码问题。针对使用字节流和字符流两种方式响应中文时可能出现的乱码现象,提出了相应的解决办法,包括确保编码一致以避免乱码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
    }
}

结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值