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);
}
}
结果: