为什么会出现中文乱码?
Java的内核和 class文件是基于 unicode 的,这使 Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦
- Java 和 JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码
- Java 和 JSP文件本身编译时产生的乱码问题和 Java 程序于其他媒介交互产生的乱码问题。
什么是编码
各种编码的由来
ASCII,Unicode和UTF-8终于找到一个能完全搞清楚的文章了
用于中国的汉字编码方案,对在ASCII 的基础上的中文扩展
由于世界各地都为自己的语言规定不同的编码,于是一个ISO(国际标谁化组织)规定世界各地语言统一使用UNICODE编码。而其中的UTF-8 是在互联网上使用最广的一种 Unicode 的实现方式。
Jsp 三个编码阶段
- 第一阶段是JSP 编译成java。它会根据pageEncoding 的设定读取JSP ,结果是由指定的编码方案翻译成统一的UTF-8 Java 源码(即.java),如果pageEncoding设定错了或没有设定,就会出现中文乱码。默认是ISO-8859-1 不支持中文编码。在eclipse 中可以通过 window–Preferences–Web–JSP File–在Eclipse的下拉列表选择UTF-8 来设置默认编码格式。
// 默认是ISO-8859-1 不支持中文编码
<%@ page language="java" pageEncoding="ISO-8859-1"%>
- 第二阶段是由javac 的java 源码至Java byteCode 的编译。不论JSP 编写时候用的是什么编码方案,经过这个阶段的结果全是UTF-8的encoding的Java源码。Javac 用UTF-8的encoding读取Java源码,编译成UTF-8 encoDing 的二进制码(即class),这是JVM 对常数字串在二进制码(Java Encoding)内表达的规范
- 第三阶段是Tomcat(或其的Application Container)载入和执行阶段二的Java二进制码输出的效果,也就是在客户端看到的,这是隐藏在阶段一和阶段二的参数contentType 就发挥了作用
// 设置传回网页的文件格式和编码方式
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
// 设置对客户端请求进行重新编码的编码。
<%request.setCharacterEncoding("utf-8"); %>
一、JSP页面乱码
一般是页面编码不一致导致的乱码,或者是未指定使用字符集编码
// 未指定使用字符集编码
<html>
<head>
<title>JSP 的中文处理 </title>
<meta http-equiv="Content-Type" content="text/html charset=UTF-8">
</head>
<body>
<%out.print("JSP 的中文处理 ");%>
</body>
</html>
解决方法:要在页面开始地方使用指定字符集编码即可,即在
页面的第一行加上:
<%@ page contentType="text/html; charset=UTF-8"%>
编码字符集设置不一致
// 编码字符集设置不一致
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<head>
<title>JSP 的中文处理 </title>
<meta http-equiv="Content-Type" content="text/html charset=UTF-8">
</head>
<body>
<%out.print("JSP 的中文处理 ");%>
</body>
</html>
第一处 <%@ page language=“java” pageEncoding=“gb2312”%> 的编码格式为 jsp文件的存
储格式。 Eclipse 会根据这个编码格式保存文件。并编译 jsp 文件,包括里面的汉字。
第二处编码为解码格式。因为存为 gb2312 的文件被解码为 iso8859-1,这样如有中文肯
定出乱码。也就是必须一致。而第二处所在的这一行,可以没有。缺省也是使用 iso8859-1
的编码格式。所以如果没有这一行的话,也会出现乱码。必须一致才可以。
第三处编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话,这个编
码格式用不用设置都可以。 有的网页出现乱码, 就是因为浏览器不能确定使用哪种编码格式。
因为页面有时候会嵌入页面,导致浏览器混淆了编码格式出现了乱码。
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset= UTF-8"%>
<html>
<head>
<title>JSP 的中文处理 </title>
<meta http-equiv="Content-Type" content="text/html charset=UTF-8">
</head>
<body>
<%out.print("JSP 的中文处理 ");%>
</body>
</html>
二、 表单提交中文时出现乱码
// 正确方式为
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Form中文处理示例</title>
</head>
<body>
下面是表单内容:
<form action="AcceptFormCharset.jsp" method="post">
用户名:<input type="text" name="userName" size="10" />
密 码:<input type="password" name="password" size="10"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
基于jsp的特殊编译使得在任何一个编译环节出错都有可能出现中文乱码问题,既然问题这么多,当然不能一个一个解决啦所以这里提供一个万能的解决方法,就是编码格式全部设置为UTF-8即可。