了解编码
1,Unicode编码又称统一码、万国码、单一码,它是业界的一种标准,是为了解决传统的字符编码方案的局限而产生的,存在很多几种实现方式如:UTF-8、UTF-16等.
2,UTF-8 是在互联网上使用最广的一种unicode的实现方式。可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
3,在 ASCII 编码中,一个英文字母字符存储需要1个字节。在 GB 2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节。
在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。
在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
在UTF-32编码中,世界上任何字符的存储都需要4个字节。
4,GBK是GB2312的扩展,他向下与GB2312兼容,,向上支持 ISO 10646.1 国际标准
中文乱码大多数都是因为编码和解码的不一致造成的,所以我们可以从5个方面入手:1, JAVA 2, JAVA WEB 3, JAVA JSP 4, JAVASCRIPTE 5, TOMCAT
理解java是如何来编码和被解码的
第一步:当我们用编辑器编写java源文件,程序文件在保存时会采用操作系统默认的编码格式(一般我们中文的操作系统采用的是GBK编码格式)形成一个.java文件。java源文件是采用操作系统默认支持的file.encoding编码格式保存的。下面代码可以查看系统的file.encoding参数值。
System.out.println(System.getProperty("file.encoding"));
第二步:当我们使用javac.exe编译我们的java文件时,JDK首先会确认它的编译参数encoding来确定源代码字符集,如果我们不指定该编译参数,JDK首先会获取操作系统默认的file.encoding参数,然后JDK就会把我们编写的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。第三步:JDK将上面编译好的且保存在内存中信息写入class文件中,形成.class文件。此时.class文件是Unicode编码的,也就是说我们常见的.class文件中的内容无论是中文字符还是英文字符,他们都已经转换为Unicode编码格式了。
注意点:使用IO流时,若不指定编码格式时,默认的编码格式都是 系统编码 。因此若输入指定了编码格式,那么输入也要指定与输入一样的编码格式。
理解JAVA WEB 编码
1,不同浏览器编码格式:
Firefox、chrome、IE都是采用UTF-8编码格式,对于Query String部分Firefox、chrome采用UTF-8,IE采用GBK。至于为什么会加上%,这是因为URL的编码规范规定浏览器将ASCII字符非 ASCII 字符按照某种编码格式编码成 16 进制数字然后将每个 16 进制表示的字节前加上“%”。
2, URL 是在 org.apache.coyote.HTTP11.InternalInputBuffer 的 parseRequestLine 方法中. 对URI的解码操作是首先获取Connector的解码集,该配置在server.xml中,如果没有定义则会采用默认编码ISO-8859-1来解析。
理解JAVA JSP页面编码过程
JSP转换为servlet过程中下面一段代码为设置页面编码格式。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
上面代码中有两个地方存在编码:pageEncoding、contentType的charset。其中pageEncoding是jsp文件本身的编码,而contentType的charset是指服务器发送给客户端时的内容编码。
理解javascript编码的三个方法:escape()、encodeURI()、encodeURIComponent()
1,escape:采用SIO Latin字符集对指定的字符串进行编码。所有非ASCII字符都会被编码为%xx格式的字符串,其中xx表示该字符在字符集中所对应的16进制数字。
2,encodeURI :对整个URL进行编码,它采用的是UTF-8格式输出编码后的字符串。不过encodeURI除了ASCII编码外对于一些特殊的字符也不会进行编码如:! @ # $& * ( ) = : / ; ? + ‘。
3, encodeURIComponent:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。相对于encodeURI,encodeURIComponent会更加强大,它会对那些在encodeURI()中不被编码的符号(; / ? : @ & = + $ , #)统统会被编码。但是encodeURIComponent只会对URL的组成部分进行个别编码,而不用于对整个URL进行编码。
理解TOMCAT编码
tomcat服务器使用的是ISO-8859-1编码格式来编码的,以我们只需要在tomcat的server.xml文件的<Connector>标签中加上URIEncoding=”utf-8″即可。