- JSP程序存在有与Servlet程序完全相同的中文乱码问题
- 输出响应正文时出现的中文乱码问题
- 读取浏览器传递的参数信息时出现的中文乱码问题
-
JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题
- JSP引擎将JSP源文件翻译成的Servlet源文件默认采用UTF-8编码,而JSP开发人员可以采用各种字符集编 码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。
- 如果JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。
-
如何解决JSP引擎翻译JSP页面时的中文乱码问题
- 通过page指令的contentType属性说明JSP源文件的字符集编码
- page指令的pageEncoding属性说明JSP源文件的字符集编码
- 在部署描述符中说明一组JSP源文件的字符集编码
<jsp-config>
<jsp-property-group>
<url-pattern>/jsp/*</url-pattern>
<page-encoding>GB2312</page-encoding>
</jsp-property-group>
</jsp-config>
- 乱码可能原因:
- Servlet程序从请求消息中获取请求参数和从数据库、文件、键盘等外设中读取一个字符串时都要将底层的字节流转换成字符串,但转换过程中指定的字符集编码与外设所输入内容的字符集编码不一致。如果某个第三方API将底层设备中的字节流数据总是按ISO8859-1转换成字符串返回,那么,对于底层设备中的GB2312编码的中文字符来说,返回的将不是其正确的Unicode码,这时候可以通过如下语句来解决:
strNew = new String(strOld.getBytes("ISO8859-1"),"GB2312"); - Servlet程序将字符串输出到浏览器、屏幕、文件和数据库时都要将字符串转换成底层的字节流,但转换过程中指定的字符集编码与外设所能显示的字符集编码不一致。
- JSP引擎将JSP源文件翻译成Servlet源文件时,其选择的字符集编码与JSP源文件实际使用的字符集编码不一致。
- JSP引擎编译由JSP源文件翻译成的Servlet 源文件时,其选择的字符集编码与Servlet 源文件的字符集编码不一致。
- Servlet程序从请求消息中获取请求参数和从数据库、文件、键盘等外设中读取一个字符串时都要将底层的字节流转换成字符串,但转换过程中指定的字符集编码与外设所输入内容的字符集编码不一致。如果某个第三方API将底层设备中的字节流数据总是按ISO8859-1转换成字符串返回,那么,对于底层设备中的GB2312编码的中文字符来说,返回的将不是其正确的Unicode码,这时候可以通过如下语句来解决:
-
诊断方法:
- 使用System.out.println语句在命令行窗口中打印出现乱码的字符串
- 跟踪某个中文字符在JSP页面运行过程中的每个阶段的编码值
-
四个一致解决中文乱码(编码本身推荐UTF-8):
1.charset
2.pageEncoding
3.页面文件本身
4.浏览器的解析
post请求解决中文乱码
1.设置请求的方式为method为post
2.设置request.setCharacterEncoding为UTF-8(注意:这一步必须在getParameter之前)
3.获取request.getParameter()
通过解决
首先明白:在传输过程中默认使用的传输编码是欧码ISO-8859-1
方法一
1.获取getParameter
2.进行解码再编码(new String(解码的byte数组,编码格式))
方法二
1.打开Tomcat的server.xml文件(/usr/local/apache-tomcat-7.0.81/conf)
2.修改<Connector>节点的属性,添加一个useBodyEncodingForURI="true"(使用请求体的编码来传输)
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"
useBodyEncodingForURI="true" />
3.把Eclipse中的servers中的server.xml也这样改
4.重启Tomcat
5.按照post的样子处理
测试代码
a.jsp
<%@ page language="java" contentType="text/html; charset=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>Insert title here</title>
</head>
<body>
<%--
1.显示中文:
四个一致解决中文乱码(编码本身推荐UTF-8):
1.charset
2.pageEncoding
3.页面文件本身
4.浏览器的解析
--%>
你好,我是中文!
<!--
2.获取中文:
2.1:post请求独有的
2.1.1.设置请求的方式为method为post
2.1.2.设置request.setCharacterEncoding为UTF-8(注意:这一步必须在getParameter之前)
2.1.3.获取request.getParameter()
2.3:通用的:
2.3.1.在传输过程中默认使用的传输编码是欧码ISO-8859-1
2.3.2.方法一:
2.3.2.1.获取getParameter
2.3.2.2.进行解码再编码(new String(解码的byte数组,编码格式))
2.3.3.方法二:
2.3.3.1.修改Tomcat的server.xml文件(/usr/local/apache-tomcat-7.0.81/conf)
2.3.3.2.修改<Connector>节点的属性,添加一个useBodyEncodingForURI="true"(使用请求体的编码来传输)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" useBodyEncodingForURI="true"
/>
2.3.3.3.把Eclipse中的servers中的server.xml也这样改
2.3.3.4.重启Tomcat
2.3.3.5.按照post的样子处理中文就是了
-->
<%
request.setCharacterEncoding("UTF-8");
%>
<%
String aux = request.getParameter("gender");
/*
public String(byte[] bytes,String charsetName) throws UnsupportedEncodingException:
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,
因此可能不等于 byte 数组的长度。当给定 byte 在给定字符集中无效的情况下,此构造方法的行为没有指定。
如果需要对解码过程进行更多控制,则应该使用 CharsetDecoder 类。
参数:
bytes - 要解码为字符的 byte
charsetName - 受支持的 charset 的名称
*/
String gender = new String(aux.getBytes("utf-8"),"utf-8"); //因为写在一起的,前面已经设置成了utf-8了,这里解码的时候写utf-8才对(默认是iso-8859-1)
%>
<%
String user = request.getParameter("user");
%>
<p>姓名:<%= user %></p>
<p>性别: <%= gender %></p>
</body>
</html>
b.jsp
<%@ page language="java" contentType="text/html; charset=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>Insert title here</title>
</head>
<body>
<form action="a.jsp" method="post">
姓名:<input type="text" name="user"/>
性别: <input type="text" name="gender"/>
<input type="submit" name="submit"/>
</form>
</body>
</html>
效果:
微信公众号:JavaWeb架构师
其它
- 源码下载
关注下方公众号,回复:javaweb_course.code
-
欢迎加入交流群:451826376
-
更多信息:www.itcourse.top
网友评论