012_HttpServletResponse响应乱码

一. HttpServletResponse响应乱码处理

1. 新建一个ResponseLuanMa的Web工程

2. 使用meta设置网页编码为GB2312

2.1. 新建一个GWMetaGB2312.java类, 使用字符流响应客户端

2.2. 编写GWMetaGB2312.java

package com.lywgames.myservlet;

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

public class GWMetaGB2312 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<!DOCTYPE html>").append("\r\n");
		sb.append("<html>").append("\r\n");
		sb.append("<head>").append("\r\n");
		// 设置网页编码为GB2312
		sb.append("<meta charset='GB2312' />").append("\r\n");
		sb.append("<title>HttpServletResponse 字符流相应中文乱码</title>").append("\r\n");
		sb.append("</head>").append("\r\n");
		sb.append("<body>").append("\r\n");
		sb.append("<h1>HttpServletResponse 字符流相应中文乱码</h1>").append("\r\n");
		sb.append("</body>").append("\r\n");
		sb.append("</html>");

// 字符流响应客户端
		resp.getWriter().println(sb.toString());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

2.3. 编写web.xml

2.4. 部署运行, 网页的中文显示乱码

2.5. 查看网页编码是GB2312, 就是我们在meta中设置的编码

3. 使用meta设置网页编码为UTF-8

3.1. 新建一个GWMetaUTF8.java类, 使用字符流响应客户端

3.2. 编写GWMetaUTF8.java类

package com.lywgames.myservlet;

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

public class GWMetaUTF8 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<!DOCTYPE html>").append("\r\n");
		sb.append("<html>").append("\r\n");
		sb.append("<head>").append("\r\n");
		// 设置网页编码为UTF-8
		sb.append("<meta charset='UTF-8' />").append("\r\n");
		sb.append("<title>HttpServletResponse 字符流相应中文乱码</title>").append("\r\n");
		sb.append("</head>").append("\r\n");
		sb.append("<body>").append("\r\n");
		sb.append("<h1>HttpServletResponse 字符流相应中文乱码</h1>").append("\r\n");
		sb.append("</body>").append("\r\n");
		sb.append("</html>");

// 字符流响应客户端
		resp.getWriter().println(sb.toString());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

3.3. 编写web.xml

3.4. 部署运行, 网页的中文显示乱码

3.5. 查看网页编码是UTF-8, 就是我们在meta中设置的编码

4. 使用HttpServletResponse的setCharacterEncoding设置字符编码GB2312

4.1. 新建一个GWSetCharacterEncodingGB2312.java类, 使用字符流响应客户端

4.2. 编写GWSetCharacterEncodingGB2312.java类

package com.lywgames.myservlet;

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

public class GWSetCharacterEncodingGB2312 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<!DOCTYPE html>").append("\r\n");
		sb.append("<html>").append("\r\n");
		sb.append("<head>").append("\r\n");
		sb.append("<title>HttpServletResponse 字符流相应中文乱码</title>").append("\r\n");
		sb.append("</head>").append("\r\n");
		sb.append("<body>").append("\r\n");
		sb.append("<h1>HttpServletResponse 字符流相应中文乱码</h1>").append("\r\n");
		sb.append("</body>").append("\r\n");
		sb.append("</html>");
		
		// 响应给客户端的字符编码GB2312
		resp.setCharacterEncoding("GB2312");
          // 字符流响应客户端
		resp.getWriter().println(sb.toString());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

4.3. 编写web.xml

4.4. 部署运行, 网页的中文显示正常

4.5. 查看网页编码是GB2312, 但是我们并没有设置网页编码

5. 使用HttpServletResponse的setCharacterEncoding设置字符编码UTF-8

5.1. 新建一个GWSetCharacterEncodingUTF8.java类, 使用字符流响应客户端

5.2. 编写GWSetCharacterEncodingUTF8.java类

package com.lywgames.myservlet;

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

public class GWSetCharacterEncodingUTF8 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<!DOCTYPE html>").append("\r\n");
		sb.append("<html>").append("\r\n");
		sb.append("<head>").append("\r\n");
		sb.append("<title>HttpServletResponse 字符流相应中文乱码</title>").append("\r\n");
		sb.append("</head>").append("\r\n");
		sb.append("<body>").append("\r\n");
		sb.append("<h1>HttpServletResponse 字符流相应中文乱码</h1>").append("\r\n");
		sb.append("</body>").append("\r\n");
		sb.append("</html>");

		// 响应给客户端的字符编码UTF-8
		resp.setCharacterEncoding("UTF-8");
          // 字符流响应客户端
		resp.getWriter().println(sb.toString());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

5.3. 编写web.xml

5.4. 部署运行, 网页的中文显示乱码

5.5. 查看网页编码是GB2312, 但是我们并没有设置网页编码

5.6. 这是我们在浏览器中手动设置编码为UTF-8, 网页的中文显示正常

5.7. 或者, 我们在meta中设置网页编码为UTF-8

5.8. 我们在meta中设置网页编码为UTF-8, 重新访问, 网页中文显示正常, 网页编码显示为UTF-8, 其中我们并没有手动在浏览器中设置网页编码。

5.9. 从上面的例子中我们大概知道, 要想响应的中文数据在浏览器中显示正常, 需要设置网页编码和字符编码统一为GB2312或者UTF-8, 推荐使用UTF-8。

6.使用HttpServletResponse的setHeader("Content-Type", "text/html; charset=GB2312"), 响应客户端的内容类型是text/html 编码是GB2312(包含字符编码和网页编码)。

6.1. 新建一个GWSetHeaderGB2312.java类, 使用字符流响应客户端

6.2. 编写GWSetHeaderGB2312.java类

package com.lywgames.myservlet;

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

public class GWSetHeaderGB2312 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<!DOCTYPE html>").append("\r\n");
		sb.append("<html>").append("\r\n");
		sb.append("<head>").append("\r\n");
		sb.append("<title>HttpServletResponse 字符流相应中文乱码</title>").append("\r\n");
		sb.append("</head>").append("\r\n");
		sb.append("<body>").append("\r\n");
		sb.append("<h1>HttpServletResponse 字符流相应中文乱码</h1>").append("\r\n");
		sb.append("</body>").append("\r\n");
		sb.append("</html>");
		
		// 响应客户端的内容类型是text/html 编码是GB2312(包含字符编码和网页编码)
		resp.setHeader("Content-Type", "text/html; charset=GB2312");
           // 字符流响应客户端
		resp.getWriter().println(sb.toString());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

6.3. 编写web.xml

6.4. 部署运行, 网页的中文显示正常

7. 使用HttpServletResponse的setHeader("Content-Type", "text/html; charset=UTF8"), 响应客户端的内容类型是text/html 编码是UTF8(包含字符编码和网页编码)。

7.1. 新建一个GWSetHeaderUTF8.java类, 使用字符流响应客户端

7.2. 编写GWSetHeaderUTF8.java类

package com.lywgames.myservlet;

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

public class GWSetHeaderUTF8 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<!DOCTYPE html>").append("\r\n");
		sb.append("<html>").append("\r\n");
		sb.append("<head>").append("\r\n");
		sb.append("<title>HttpServletResponse 字符流相应中文乱码</title>").append("\r\n");
		sb.append("</head>").append("\r\n");
		sb.append("<body>").append("\r\n");
		sb.append("<h1>HttpServletResponse 字符流相应中文乱码</h1>").append("\r\n");
		sb.append("</body>").append("\r\n");
		sb.append("</html>");

		// 响应客户端的内容类型是text/html 编码是UTF-8(包含字符编码和网页编码)
		resp.setHeader("Content-Type", "text/html; charset=UTF-8");
          // 字符流响应客户端
		resp.getWriter().println(sb.toString());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

7.3. 编写web.xml

7.4. 部署运行, 网页的中文显示正常

8. 用HttpServletResponse的setContentType("text/html;charset=GB2312")

, 响应客户端的内容类型是text/html 编码是GB2312(包含字符编码和网页编码)。推荐使用setContentType方法。

8.1. 新建一个GWSetContentTypeGB2312.java类, 使用字符流响应客户端

8.2. 编写GWSetContentTypeGB2312.java类

package com.lywgames.myservlet;

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

public class GWSetContentTypeGB2312 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<!DOCTYPE html>").append("\r\n");
		sb.append("<html>").append("\r\n");
		sb.append("<head>").append("\r\n");
		// 网页编码GB2312
		sb.append("<meta charset='GB2312' />").append("\r\n");
		sb.append("<title>HttpServletResponse 字符流相应中文乱码</title>").append("\r\n");
		sb.append("</head>").append("\r\n");
		sb.append("<body>").append("\r\n");
		sb.append("<h1>HttpServletResponse 字符流相应中文乱码</h1>").append("\r\n");
		sb.append("</body>").append("\r\n");
		sb.append("</html>");
		
		// 响应客户端的内容类型是text/html 编码是GB2312(包含字符编码和网页编码)
		resp.setContentType("text/html;charset=GB2312");
          // 字符流响应客户端
		resp.getWriter().println(sb.toString());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

8.3. 编写web.xml

8.4. 部署运行, 网页的中文显示正常

9. 用HttpServletResponse的setContentType("text/html;charset=UTF8"), 响应客户端的内容类型是text/html 编码是UTF8(包含字符编码和网页编码)。

9.1. 新建一个GWSetContentTypeUTF8.java类, 使用字符流响应客户端

9.2. 编写GWSetContentTypeUTF8.java类

package com.lywgames.myservlet;

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

public class GWSetContentTypeUTF8 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<!DOCTYPE html>").append("\r\n");
		sb.append("<html>").append("\r\n");
		sb.append("<head>").append("\r\n");
		// 网页编码UTF-8
		sb.append("<meta charset='UTF-8' />").append("\r\n");
		sb.append("<title>HttpServletResponse 字符流相应中文乱码</title>").append("\r\n");
		sb.append("</head>").append("\r\n");
		sb.append("<body>").append("\r\n");
		sb.append("<h1>HttpServletResponse 字符流相应中文乱码</h1>").append("\r\n");
		sb.append("</body>").append("\r\n");
		sb.append("</html>");

		// 响应客户端的内容类型是text/html 编码是UTF-8(包含字符编码和网页编码)
		resp.setContentType("text/html;charset=UTF-8");
           // 字符流响应客户端
		resp.getWriter().println(sb.toString());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

9.3. 编写web.xml

9.4. 部署运行, 网页的中文显示正常

10. 使用字节流响应数据, 字节流默认字符编码是UTF-8

10.1. 新建类GetOutputStreamLuanMa.java

10.2. 编写GetOutputStreamLuanMa.java

package com.lywgames.myservlet;

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

public class GetOutputStreamLuanMa extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("<!DOCTYPE html>").append("\r\n");
		sb.append("<html>").append("\r\n");
		sb.append("<head>").append("\r\n");
		sb.append("<meta charset='UTF-8' />").append("\r\n");
		sb.append("<title>HttpServletResponse 字节流相应中文乱码</title>").append("\r\n");
		sb.append("</head>").append("\r\n");
		sb.append("<body>").append("\r\n");
		sb.append("<h1>HttpServletResponse 字节流相应中文乱码</h1>").append("\r\n");
		sb.append("</body>").append("\r\n");
		sb.append("</html>");
		
		// 字节流, 默认字符编码是UTF-8
		resp.getOutputStream().write(sb.toString().getBytes());
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

10.3. 编写web.xml

10.4. 部署运行

11. 不管是字节流还是字符流, 直接使用一行代码就可以解决响应乱码问题。

response.setContentType("text/html;charset=UTF-8");

注: 我们最好使用<meta charset='UTF-8' />设置网页编码, 都设置为UTF-8编码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值