我们在写项目的时候经常会见到乱码,并且对于乱码的处理都有各种不同的情况,现总结如下
Response向浏览器响应中文
使用字节流响应中文:
package com.item.servlet.demo3;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Response响应中文的
*/
@WebServlet("/Servletdemo1")
public class Servletdemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getOutputStream().write("中文".getBytes());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
在浏览器中输入:http://localhost:8080/web_test/Servletdemo1
效果如下:
分析如下:
上述方式输出到浏览器,产生乱码?不确定
原因:乱码的产生与中文所转换的字节数组及浏览器打开方式(打开的时候所采用的默认字符集)有关,这里的"中文".getBytes()
采用的就是默认的字符集
解决:将中文转成字符数组的时候和浏览器打开默认时采用的字符集一样即可
//设置浏览器默认打开时候采用的字符集
response.setHeader("Content-Type","text/html;charset=UTF-8");
//设置中文转成字符数组字符集编码
outputStream.write("中文".getBytes("UTF-8"));
效果如下:
使用字符流响应中文
在Servlet中写如下代码:
response.getWriter().print("中文");
分析
上述方式输出到浏览器,产生乱码?一定产生乱码
原因:字符流有缓冲区,response获得字符流,response设计默认的缓冲编码是iso-8859-1
.这个字符集不支持中文。
解决:设置response获得字符流缓冲区的编码和浏览器默认打开编码方式
//设置浏览器默认打开的时候采用的字符集
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//设置response获得字符流的缓冲区的编码
response.setCharacterEncoding("UTF-8");
PrintWriter writer = response.getWriter();
writer.print("中文");
字符流向页面响应中文,有一种简化的方式
response.setContentType("text/html;charset=UTF-8");
上述方式直接代替了
//设置浏览器默认打开的时候采用的字符集
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//设置response获得字符流的缓冲区的编码
response.setCharacterEncoding("UTF-8");
总结:
上述两种字节流和字符流响应到页面是具体分析了原因,而我们在写项目的时候,一般直接用字符流响应,所以解决乱码问题直接写上response.setContentType("text/html;charset=UTF-8");
即可
request对象接收表单请求参数的中文乱码问题
编写demo2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>post方式接收中文</h1>
<form action="/web_test/Requestdemo3" method="post">
姓名:<input type="text" name="name"><br/>
<input type="submit" value="提交">
</form>
<h1>get方式接收中文</h1>
<form action="/web_test/Requestdemo3" method="get">
姓名:<input type="text" name="name"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
编写Requestdemo3
package com.item.request.demo1;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Requestdemo3")
public class Requestdemo3 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
System.out.println(name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("name");
System.out.println(name);
}
}
浏览器输入http://localhost:8080/web_test/request/demo2.html
可以看到控制台不管哪种方式提交都产生了乱码
分析
post方式
post方式提交的数据是在请求体中,request对象接收到数据之后放入request的缓冲区中,
1缓冲区有默认的编码(iso-8859-1)不支持中文。
2解决办法:修改request的缓冲区编码。
request.setCharacterEncoding("UTF-8");
get方式
产生乱码的原因:
get方式提交的数据是在请求行中,在地址栏上已经进行了一次编码,
解决办法:将存入到request缓冲区中的值以iso-8859-1的方式获取到,再以
utf-8解码
String name = request.getParameter("name");
//可以直接用String 的一个构造方法(开发过程中常用)
String value=new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("姓名:"+value);
修改如下:
package com.item.request.demo1;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*/
@WebServlet("/Requestdemo3")
public class Requestdemo3 extends HttpServlet {
private static final long serialVersionUID = 1L;
/*
*
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
//可以直接用String 的一个构造方法(开发过程中常用)
String value=new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("姓名:"+value);
}
/*
*
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
System.out.println("姓名:"+name);
}
}
总结:一般表单post提交比较方便,只需修改缓冲区的编码即可。