一. 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编码。