JSP&Servlet中字符编码的转换
程序员文章站
2024-02-22 15:47:36
...
1. 在jsp中声明字符编码
<%@ page contentType="text/html; charset=utf-8" %>
或者
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
或者
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
2. 在HTML文档的头部
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
</head>
3. 在设定MySQL数据库URL时
String dbUrl="jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf-8";
4. 当请求方式是“Post”时
此时请求参数位于请求头的正文部分,可以将正文的字符编码进行设置再读取。
request.setCharacterEncoding("utf-8");
String aname=request.getParameter("aname");
当请求方式为“Get”时,请求参数位于请求头的URI中,此时使用上述方法不能改变请求参数的字符编码。
5. 直接对字符串编码进行转换
String str=...;
str=new String(str.getBytes("GB2312"),"UTF-8");
HTTP的Get参数默认为ISO-8859-1编码,所以转码可以:
String data=request.getParameter("aname");
data = new String(data.getBytes("ISO-8859-1"), "UTF-8");
6. 上传文件时转码
org.apache.tomcat.util.http.fileupload.FileItem.getString("utf-8")
或者
org.apache.commons.fileupload.FileItem.getString("utf-8")
7. Cookie的转码
Cookie不能直接存放中文,会出现 “Control character in cookie value or attribute” 的错误。需将中文字符转成BASE64编码。
- 编码
import java.net.URLEncoder;
...
String encodeUserName = URLEncoder.encode(userName, "UTF-8");
String encodePassword = URLEncoder.encode(password, "UTF-8");
Cookie cookie = new Cookie("user", encodeUserName + "-" + encodePassword);
cookie.setMaxAge(60 * 60 * 24 * 7); // 单位:秒
response.addCookie(cookie);
- 解码
Cookie[] cookies=request.getCookies();
for(int i=0;cookies!=null && i<cookies.length;i++){
if(cookies[i].getName().equals("user")){
//对Cookie中的中文信息进行BASE64的解码
String str=cookies[i].getValue().split("-")[0];
userName=URLDecoder.decode(str,"UTF-8");
str=cookies[i].getValue().split("-")[1];
password=URLDecoder.decode(str,"UTF-8");
}
}
8. 对返回客户端的响应进行编码设定
HttpServletResponse response默认编码是“ISO8859-1”。
response.setCharacterEncoding("gbk");
或者
response.setCharacterEncoding("utf8");