Servlet & JSP - 中文字符问题
Servlet 中的中文字符
来自 URL 参数部分的中文字符
Tomcat 默认接收数据的编码是 ISO-8859-1。所以当请求 URL 的参数部分含有中文字符,需要转换字符的编码。
Enumeration<String> paramNames = req.getParameterNames(); while (paramNames.hasMoreElements()) { String paramName = (String) paramNames.nextElement(); String paramValue = req.getParameter(paramName); String paramValueUTF8 = new String(paramValue.getBytes("ISO-8859-1"), "UTF-8"); System.out.println(paramName + ": " + paramValueUTF8); }
上述的方法的一个不足是:需要对所有的参数部分解码。可以直接在 Tomcat 的 server.xml 中将默认的编码设置为 UTF-8。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
来自 POST 表单的中文字符
当客户端提交的表单内容包含中文字符时,可以在获取表单内容前,调用 request.setCharacterEncoding 方法来设置字符的编码:
req.setCharacterEncoding("UTF-8"); Enumeration<String> paramNames = req.getParameterNames(); while (paramNames.hasMoreElements()) { String paramName = (String) paramNames.nextElement(); System.out.println(paramName + ": " + req.getParameter(paramName)); }
响应至客户端的中文字符
当响应至客户端的内容包含中文字符时,可以在获取输出流之前,调用 response.setContentType 方法来设置响应内容的类型及编码。
resp.setContentType("text/plain;charset=utf-8");
resp.getWriter().println("中文字符");
HTTP 首部的中文字符
HTTP 首部只支持 ASCII 编码,可以对首部进行 URL 编码。
resp.setContentType("text/plain;charset=utf-8"); String fileName = URLEncoder.encode("中文名称.txt", "UTF-8"); resp.setHeader("Content-disposition", "attachment;filename=" + fileName);
JSP 中的中文字符
JSP 页面内容的中文字符
当 jsp 页面内容包含中文字符时,可以使用 page 指令来指定字符编码。
<%@ page language="java" contentType="text/html; UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>中文标题</title> </head> <body> 中文内容 </body> </html>
JSP Java 代码中的中文字符
JSP 的本质即 Servlet,所以当 JSP 页面中的 Java 代码包含中文字符时,则可以参考 Servlet 中是如何解决中文字符的。