本帖最后由 小石姐姐 于 2018-5-23 16:47 编辑
请求和响应中乱码的处理
解决向页面输出中文的乱码问题!!!
* 在响应前设置
response.setContentType("text/html;charset=UTF-8");
1.request请求解决乱码:
1.1POST的解决方案:
* POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.
request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
* 设置request的缓冲区的编码:
* request.setCharacterEncoding(“UTF-8”); --- 一定要在接收参数之前设置编码就OK.
1.2GET的解决方案:
* 1.修改tomcat的字符集的编码.(不推荐)
* 2.使用URLEncoder和URLDecoder进行编码和解码的操作.
filename = URLEncoder.encode(filename,"utf-8");
* 3.使用String的构造方法:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
2.response响应解决乱码:
2.1.字节流:
* 设置浏览器默认打开编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
* 中文转成字节数组编码
response.getOutputStream().write("王守义".getBytes("UTF-8"));
2.2.字符流:
* 设置response的缓冲区的编码
response.setCharacterEncoding("UTF-8");
* 设置浏览器默认打开的编码.
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");相当于上面两句
3.1下载时文件名乱码的解决:
针对不同的浏览器进行不同的编码
if(agent.contains("Firefox")){
//版本信息包含Firefox时,说明为火狐浏览器
filename = base64EncodeFileName(filename);
}else{
//其它浏览器
filename = URLEncoder.encode(filename,"UTF-8");
}
// 2.设置Content-Disposition头,这样下载的时候显示的文件名就是正常的中文了
response.setHeader("Content-Disposition", "attachment;filename="+filename);
1.提交 中文乱码的问题:(request接受参数)
问题:
* 表单提交的时候,get和post两种方式提交'中文'都是乱码
解决办法:
* POST的解决方案:
* 分析:
* 因为request缓冲区默认编码为'ISO-8859-1'这个编码不认识中文,当请求体里的中存到reuquest中时,
就会变成乱码,当再从缓冲区取出时,更是乱码;
* POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中,
request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
* 设置request的缓冲区的编码:
* request.setCharacterEncoding(“UTF-8”); --- 一定要在接收参数之前设置编码就OK.
* GET的解决方案:
* 分析:
get方式提交数据时,要先被编码到地址栏中,再将信息存入request缓冲中,字从缓冲区值取出数据.
* 1.修改tomcat的字符集的编码.(不推荐)
* 2.使用URLEncoder和URLDecoder进行编码和解码的操作.(???怎么用)
* 3.使用String的构造方法和获取字节数组的方法:
* String(byte[] bytes, Charset charset)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
* byte[] getBytes(String charsetName)
使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
* 两个方法组合使用:
String(getBytes(String charsetName), Charset charset)
例:
/**
* 使用request解决中文乱码的问题:
*/
public class RequestServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*String name = request.getParameter("name");
String ss = new String(name.getBytes("ISO-8859-1"),"UTF-8");*/
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
System.out.println("GET方式:"+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println("POST方式:"+name);
}
}
2.响应中文 出现乱码
2.1字符流:
问题:
使用字符流输出中文:
* 有没有乱码?为什么?
* 一定会乱码.response使用的字符流有缓冲区的.
* response的字符流的缓冲区的默认的编码是ISO-8859-1.编码根本不支持中文.
* 解决:
* 设置response的字符流的缓冲区的编码.
* 设置浏览器默认打开的时候采用的字符集编码.
格式:
* 第一种:
response.setHeader("Content-Type", "text/html;charset=UTF-8"); // 设置浏览器默认打开的时候采用的字符集编码
response.setCharacterEncoding("UTF-8");// 设置response的字符流的缓冲区的编码.
* 第二种:
response.setContentType("text/html;charset=UTF-8"); //简化写法
response.getWriter().println("中文");
2.2字节流:
原因:
使用字节流输出中文:
* 有没有乱码?为什么?
* 不一定.
* 解决:
* 设置浏览器默认打开的时候采用的字符集编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
* 设置中文转成字节数组的时候取出的编码
response.getOutputStream().write("中文".getBytes("UTF-8"));
* 当使用浏览器打开文本文档时,gb2312格式的文档可
以和String s = new String("中文".getBytes("gb2312"));格式的文字同时打开;
格式:
response.setHeader("Content-Type", "text/html;charset=UTF-8"); // 设置浏览器默认打开的时候采用的字符集编码
response.getOutputStream().write("中文".getBytes("UTF-8")); // 设置中文转成字节数组的时候取出的编码
例:
/**
* 向页面做出响应的Servlet
*/
public class OutPrintServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
test4(response);
}
/**
* 使用字符流输出中文:
* * 有没有乱码?为什么?
* * 一定会乱码.response使用的字符流有缓冲区的.
* * response的字符流的缓冲区的默认的编码是ISO-8859-1.编码根本不支持中文.
* * 解决:
* * 设置response的字符流的缓冲区的编码.
* * 设置浏览器默认打开的时候采用的字符集编码.
* @param response
* @throws IOException
*/
private void test4(HttpServletResponse response) throws IOException {
// 设置浏览器默认打开的时候采用的字符集编码
//response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 设置response的字符流的缓冲区的编码.
//response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8"); //简化写法
response.getWriter().println("中文");
}
/**
* 使用字节流输出中文:
* * 有没有乱码?为什么?
* * 不一定.
* * 解决:
* * 设置中文转成字节数组取出的时候的编码
* * 设置浏览器默认打开的时候编码
* @param response
* @throws IOException
*/
private void test3(HttpServletResponse response) throws IOException {
// 设置浏览器默认打开的时候采用的字符集编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 设置中文转成字节数组的时候取出的编码
response.getOutputStream().write("中文".getBytes("UTF-8"));
}
/**
* 使用字符流响应数据:
* @param response
* @throws IOException
*/
private void test2(HttpServletResponse response) throws IOException {
response.getWriter().println("Hello Writer Response...");
}
/**
* 使用字节流响应数据:
* @param response
* @throws IOException
*/
private void test1(HttpServletResponse response) throws IOException {
response.getOutputStream().write("Hello OutputStream Response...".getBytes());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
|
|