Java 虽然是采用 Unicode 字符的。但是在网络通信中,都是采用字节进行传输的,由于在传输时并没有告之 tomcat 使用什么编码,那么 tomcat 就会使用 ISO8859-1 的编码格式进行传输。
举个例子吧,比如我们要传输的字符串是“劳动节快到了”,这个串的 GBK 编码为:
c0cd b6af bdda bfec b5bd c1cb (GBK 是采用两个字节的,这里采用空格进行了分隔)
在网络传输中是以 Big-Endian 方式传送的,也就是一个字节一个字节地传,依次会这样:
c0 cd b6 af bd da bf ec b5 bd c1 cb
在 tomcat 接收到这些字节时,并不知道该如何去组装这些字节,默认就使用一个字节编码的 ISO8859-1 进行编码,得出的字符为:
Java codeÀ Í ¶ ¯ ½ Ú ¿ ì µ ½ Á Ë
c0 cd b6 af bd da bf ec b5 bd c1 cb
这很明显是不正确的,但是我们如果使用传输之前的编码进行组装的话,编码器就会根本字符集的特征将这些字节组装并编码成字符串了。像上面这个如果使用 new String(s.getBytes("ISO-8859-1"), "GBK") 的话,就会两个字节,两个字节的进行组装:
Java code 劳 动 节 快 到 了
c0cd b6af bdda bfec b5bd c1cb
页面传输时到达时是gbk编码的字节数组!如果传到Servlet,默认是用Iso对字节数组组装,这时会出现乱码!如果设置request.setCharactorEncoding这时就用特定的编码进行组装!!
如果对编码格式熟悉的话,出现了乱码,那基本上只要看一下这个乱码的特征就会知道什么地方转码出现了错误。比如:
* 出现一些稀奇古怪的符号(没有一个是汉字的),这一般是 GBK 或者 UTF-8 采用 ISO8859-1 进行显示了。
* 如果出现稀奇古怪的符号,并夹杂着一些繁体或者简体汉字的话,这一般是 GBK 与 UTF-8 转码出现了错误。如果出现的字符数比原字符数多的话,那表明本该 UTF-8 的字符采用 GBK 进行转码了,如果出现的字符数比原字符数少的话,那表明本该 GBK 的字符采用 UTF-8 进行转码了
举个例子吧,比如我们要传输的字符串是“劳动节快到了”,这个串的 GBK 编码为:
c0cd b6af bdda bfec b5bd c1cb (GBK 是采用两个字节的,这里采用空格进行了分隔)
在网络传输中是以 Big-Endian 方式传送的,也就是一个字节一个字节地传,依次会这样:
c0 cd b6 af bd da bf ec b5 bd c1 cb
在 tomcat 接收到这些字节时,并不知道该如何去组装这些字节,默认就使用一个字节编码的 ISO8859-1 进行编码,得出的字符为:
Java codeÀ Í ¶ ¯ ½ Ú ¿ ì µ ½ Á Ë
c0 cd b6 af bd da bf ec b5 bd c1 cb
这很明显是不正确的,但是我们如果使用传输之前的编码进行组装的话,编码器就会根本字符集的特征将这些字节组装并编码成字符串了。像上面这个如果使用 new String(s.getBytes("ISO-8859-1"), "GBK") 的话,就会两个字节,两个字节的进行组装:
Java code 劳 动 节 快 到 了
c0cd b6af bdda bfec b5bd c1cb
页面传输时到达时是gbk编码的字节数组!如果传到Servlet,默认是用Iso对字节数组组装,这时会出现乱码!如果设置request.setCharactorEncoding这时就用特定的编码进行组装!!
如果对编码格式熟悉的话,出现了乱码,那基本上只要看一下这个乱码的特征就会知道什么地方转码出现了错误。比如:
* 出现一些稀奇古怪的符号(没有一个是汉字的),这一般是 GBK 或者 UTF-8 采用 ISO8859-1 进行显示了。
* 如果出现稀奇古怪的符号,并夹杂着一些繁体或者简体汉字的话,这一般是 GBK 与 UTF-8 转码出现了错误。如果出现的字符数比原字符数多的话,那表明本该 UTF-8 的字符采用 GBK 进行转码了,如果出现的字符数比原字符数少的话,那表明本该 GBK 的字符采用 UTF-8 进行转码了