一些基本概念
字符集(Character):
一系列抽象字符(可以是各种国家的文字、符号、数字等等)的集合。
常见字符集名称:
ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。
编码规则(Character Encoding):
将字符集与另一类信息集合互相对应起来的法则(在这里对应的是计算机中的数字代码)。
每种字符集都有相应的(一个或多个)编码规则。
计算机要准确的处理各种字符集文字,就需要按照相应的编码规则进行转换,以便计算机能够识别和存储各种文字。
编码与解码:
计算机中储存的信息都是用二进制数表示的数字代码(都是0和1),
而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。
这之间存在着"编码"、"解码"的过程。
按照某种编码规则将字符转换成二进制数字代码存储到计算机中,称为"编码"。
反之,按照某种编码规则将存储在计算机中的二进制数字代码解析成对应的字符显示出来,称为"解码"。
乱码的发生:
在解码过程中,如果使用了与编码时不一致的编码规则,就会导致最后显示的内容出现乱码。
文本编辑软件(这里指带有文本编辑功能的软件)和编码规则
文本编辑软件在保存文本内容的时候一般都是根据系统默认的编码规则来进行编码的。
文本编辑软件在读取内容的时候一般都是根据所读取的内容来推测其编码规则,
并以此编码规则来进行解码和显示。
但是有时会出现推测不准确的现象,导致显示出来的内容是乱码。
也有不少文本编辑软件可以指定打开文本时所使用的编码规则。
JSP、html文件和编码规则
静态网页html中一般都会有
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
这么一段话。
其中的“charset=ISO-8859-1”用来告诉浏览器以什么编码规则来解码显示网页内容。
静态网页html显示乱码:
如果html文件中的“charset”和html文件实际使用的编码规则不一致,就会出现乱码。
动态网页JSP中一般都会有
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
这么一段话。
其中“pageEncoding”告诉web服务器这个jsp文件编写时使用的是什么编码规则。
“contentType charset”用来告诉浏览器以什么编码规则来解码显示网页内容。
如果“pageEncoding”和“contentType charset”都没有设定的话,那么两者都会默认使用“ISO-8859-1”。
如果“pageEncoding”和“contentType charset”其中有一个指定的话,那么另一个也一样。
一个JSP的源文件需要经过三个阶段,才能完成一次完整的输出。
第一阶段:从JSP到Servlet(.java文件)
Web服务器会根据“pageEncoding”的设定解码读取JSP,再翻译成统一的UTF-8 JAVA源码(即.java)。
第二阶段:从Servlet文件(.java)到Java字节码文件(.class)
此过程是由JAVAC命令完成的,主要是将(.java)的源文件翻译成JVM可识别的Java字节码文件(二进制码文件)。
整个过程都是UTF-8编码规则下进行的。
第三阶段:从Web服务器到浏览器
Web服务器将第二阶段之后得到的Java字节码根据“contentType charset”进行转换并输出到浏览器。
浏览器再根据“contentType charset”解码显示。
动态网页JSP显示乱码:
如果JSP文件中的“pageEncoding”和其实际使用的编码规则不一致,就会出现乱码。
如果JSP文件中的存在其“contentType charset”不支持的字符,最后显示时也会出现乱码。
以上。如果有不对的地方,请高手帮忙指正,谢谢!