JAVA乱码:
测试代码:
public
class SayHello {
publicstaticvoid main(String[] args){
//System.setProperty("file.encoding", "iso8859-1");
System.out.println("您好!");
}
}
采用JVM默认file.encoding编码编译:(默认为GBK)
指定file.encoding编译:(指定为iso8859-1)
可以看出,若不指定初始参数file.encoding=iso8859-1(采用默认的GBK),则打印出乱码。同时,若指定的值与编译时不一致也会是乱码。
因此,解决乱码的关键在于,写与读时,编码方式要一致。
--------------------------------------------------------------------------------------------------------------
JSP乱码:
测试jsp页面:
用EditPlus书写jsp页面encoding.jsp
java" contentType="text/html; charset=GB2312"
pageEncoding="UTF-8"%>]]>
测试页面
欢迎您!
然后保存到tomcat的Root目录下文件中,注意:选择编码方式为UTF-8
游览此页面,可以看到页面正常无乱码:
将:
java" contentType="text/html; charset=GB2312" pageEncoding="UTF-8"%>]]>
替换为:
java" contentType="text/html; charset=GB2312" pageEncoding="GBK"%>]]>
再次游览此页面,页面出现乱码:
原理:
]]>
在这行的页面指令中的"text/html; charset=UTF-8"将应答消息中的"Content-type" 设置为"text/html; charset=UTF-8"。
"pageEncoding"只是指明了 JSP 页面本身的编码格式,指明了 JSP 是以什么编码方式保存。容器在读取文件时将起转化为内部使用的 Unicode. 当应答发送回至浏览器时,容器会将内部使用的 Unicode 转化为在 Content-type 中指定的字符集。
如果没有指定 PageEncoding,可以通过使用 Content-type 指定的字符集来解释 JSP 页面字节。
jsp页面在服务器端处理的过程是:
jsp—>.java文件—> .class文件
jsp—> .java文件是由服务器读取jsp页面文件,根据pageEncoding指明的编码方式自动转换的。与前面java乱码一节中指出的,这里也要保证写与读时编码一致才不会出现乱码。从上面的例子也验证了这一点。
.java文件 --> .calss文件过程,即为java编译过程,由服务器边jvm自动进行。
至于,text/html; charset=GB2312,则可以设置成任何游览器支持的并且支持中文的编码方式,都能保证页面不出现乱码。(表单提交及URL请求不在此讨论范围内),这是因为,在生成响应给游览器前,虚拟机中以unicode编码的中文是正确的,服务器会更据指定的charset,将unicode转换成正确的编码。
参考文章:
Java 编程技术中汉字问题的分析及解决
JSP/Servlet 中的汉字编码问题
编码字符集与Java -Java World乱码问题根源之所在
UTF-8 字符处理在 Web 开发中的应用
Technorati 标签:
java jsp 乱码