转载:https://www.cnblogs.com/haimishasha/p/6117968.html
目录
1.1. ISO-8859-1 通常叫做Latin-1
1.2. GB2312/GBK
1.3 unicode
1.4 UTF
2.1 Unicode与各编码之间的直接转换
2.2 Unicode与各编码之间的交叉转换
2.3 编码过程中错误诊断参考
3.1 getBytes(charset)
3.2 new String(charset)
3.3 setCharacterEncoding()
3.4. 处理过程
3.4.1. 表单输入
3.4.2. 文件编译
3.5. javaEE几处设置
3.5.1. jsp编译
3.5.2. jsp输出
3.5.3. meta设置
3.5.4. form设置
3.5.5. JSP页面获取表单的值
4.1. MySQL数据库
4.2. apache
4.3. linux默认编码
4.4. 其它
5.1. URL编码
5.2. rewrite
5.3. URLEncode.encode()
6.1. SecureCRT
6.2. 过滤器
6.3. POST和GET
6.4. 简繁体编码转换
我们最初学习计算机的时候,都学过ASCII编码。
但是为了表示各种各样的语言,在计算机技术的发展过程中,逐渐出现了很多不同标准的编码格式,
重要的有Unicode、UTF、ISO-8859-1和中国人经常使用的GB2312、BIG5、GBK等。
1.编码基础知识
最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。
1.1. ISO-8859-1 通常叫做Latin-1
属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。
很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。
而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,
以gb2312编码为例,应该是"d6d0 cec4"两个字符(java字符占2个字节),
使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的)。
而如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87"。
很明显,这种表示方法还需要以另一种编码为基础。
1.2. GB2312/GBK
这就是汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。
其中gbk编码能够用来同时表示繁体字和简体字,
而gb2312只能表示简体字,gbk是兼容gb2312编码的。
1.3 unicode
这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母a为"00 61"。
需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。
1.4 UTF
考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。
2.Unicode、UTF-8 和 ISO8859-1区别与联系
将以"中文"两个字为例,经查表可以知道其
GB2312编码是"d6d0 cec4",
Unicode编码为"4e2d 6587",
UTF编码就是"e4b8ad e69687"。
注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来表示。
2.1 Unicode与各编码之间的直接转换
下面以对中文字符串"a中文"的编码转换为例,来了解各种编码之间的转换
1)Unicode和GBK
测试结果如下,每个汉字转换为两个字节,且是可逆的,即通过字节可以转换回字符串
String-GBK〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4
ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u4E2D/u6587(a中文)
2)Unicode和UTF-8
测试结果如下,每个汉字转换为三个字节,且是可逆的,即通过字节可以转换回字符串
String-UTF-8〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87
ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u4E2D/u6587(a中文)
3)Unicode和ISO-8859-1
测试结果如下,当存在汉字时转换失败,非可逆,即通过字节不能再转换回字符串
String-ISO-8859-1〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0x3F 0x3F
ByteArray-ISO-8859-1〉String:0x61 0x3F 0x3F-〉/u0061/u003F/u003F(a??)
2.2 Unicode与各编码之间的交叉转换
在上面直接转换中,由字符串(Unicode)生成的字节数组,在构造回字符串时,使用的是正确的编码集合,如果使用的不是正确的编码集合会怎样呢?会正确构造吗?如果不能正确构造能有办法恢复吗?会信息丢失吗?
下面我们就来看看这种情况,这部分可以说明在某些情况下虽然我们最终正确显示了结果,但其间仍然进行了不正确的转换。
1)能够正确显示的中间不正确转换
我们知道String-GBK〉ByteArray-GBK〉String是正确的,但如果我们采用String-GBK〉
ByteArray-ISO-8859-1〉String呢?通过测试结果如下:
String-GBK〉ByteArray-ISO-8859-1〉String:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u00D6/u00D0/u00CE/u00C4(a????
这时我们得到的字符串为?乱码“a????”,但是通过继续转换我们仍然可以复原回正确的字符串“a中文”,过程如下:
String-GBK〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-GBK〉String
对应:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u00D6/u00D0/u00CE/u00C4(a????)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u4E2D/u6587(a中文)
也就是我们在首次构造字符串时,我们用了错误的编码集合得到了错误的乱码,但是我们通过错上加错,再用错误的编码集合获取字节数组,然后再用正确的编码集合构造,就 又恢复了正确的字符串。这时就属于是“能够正确显示的中间不正确转换”。在Jsp页面提交数据处理时常常发生这种情况。
此外能够正确显示的中间不正确转换还有:
String-UTF-8〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-UTF-8〉String
和
String-UTF-8〉ByteArray-GBK〉String-GBK〉ByteArray-UTF-8〉String
对应:/u0061/u4E2D/u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u6D93/uE15F/u6783(a涓枃)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u4E2D/u6587(a中文)
2.3 编码过程中错误诊断参考
1)一个汉字对应一个问号
在通过ISO-8859-1从字符串获取字节数组时,由于一个Unicode转换成一个byte,当遇到不认识的Unicode时,转换为0x3F,这样无论用哪种编码构造时都会产生一个?乱码。
2)一个汉字对应两个问号
在通过GBK从字符串获取字节数组时,由于一个Unicode转换成两个byte,如果此时用ISO-8859-1或用UTF-8构造字符串就会出现两个问号。
若是通过ISO-8859-1构造可以再通过上面所说的错上加错恢复(即再通过从ISO-8859-1解析,用GBK构造);
若是通过UTF-8构造则会产生Unicode字符"/uFFFD",不能恢复,若再通过String-UTF-8〉ByteArray-GBK〉String,则会出现杂码,如a锟斤拷锟斤拷
3)一个汉字对应三个问号
在通过UTF-8从字符串获取字节数组时,由于一个
这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如"中文",正常情况下(即没有错误的时候)存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4".如果charset为"utf8"则最后是"e4 b8 ad e6 96 87".如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。
3. java对字符的处理
在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。
3.1 getBytes(charset)
这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。
注意字符串在java内存中总是按unicode编码存储的。
比如"中文",正常情况下(即没有错误的时候)存储为"4e2d 6587",
如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4"。
如果charset为"utf8"则最后是"e4 b8 ad e6 96 87"。
如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。
3.2 new String(charset)
这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。
参考上述getBytes的例子,"gbk" 和"utf8"都可以得出正确的结果"4e2d 6587",但iso8859-1最后变成了"003f 003f"(两个问号)。
因为utf8可以用来表示/编码所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。
3.3 setCharacterEncoding()
该函数用来设置http请求或者相应的编码。
对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理。
参见下述"表单输入"。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。
java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。
该指定只对POST方法有效,对GET方法无效。分析原因:
POST方法在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。
GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析所有的提交内容,setCharacterEncoding()自然就无效。
注意:iso-8859-1是JAVA网络传输使用的标准字符集,而gb2312是标准中文字符集,当你作出提交表单等需要网络传输的操作的时候,就需要把 iso-8859-1转换为gb2312字符集显示,否则如果按浏览器的gb2312格式来解释iso-8859-1字符集的话,由于2者不兼容,所以会 是乱码.
例子:
//1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉//charsetName转换
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException
//2)将字节数组以指定的编码集合构造成字符串,完成charsetName-〉Unicode转换
public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException
String s = "你好";
// 编码
byte[] utf = s.getBytes("utf-8");
byte[] gbk = s.getBytes("gbk");
System.out.println("utf-8编码:" + Arrays.toString(utf));//[-28,-67,-96,-27,-91,-67] 6个字节
System.out.println("gbk编码:" + Arrays.toString(gbk));//[-60,-29,-70,-61] 4个字节
// 解码
String s1 = new String(utf, "utf-8"); // 你好
String s2 = new String(utf, "gbk"); // gbk解码:浣犲ソ gbk用2个字节解码,所以会多一个字符
String s3 = new String(gbk, "utf-8"); // gbk用utf-8解码:??? utf-8解码需要6个字节
System.out.println("--------------------");
System.out.println("utf-8解码:" + s1);
System.out.println("gbk解码:" + s2);
System.out.println("gbk用utf-8解码:" + s3);
System.out.println("---------------------");
System.out.println("用utf-8编码回去");
s3 = new String(s3.getBytes("utf-8"), "gbk"); // 锟斤拷锟? gbk用utf-8解码后无法编回去
System.out.println(s3);
1 |
"data:image/png;base64,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" alt= "" >
|
规律:
utf-8编码可以用gbk和iso8859-1解码后编回去
gbk编码后只能用iso8859-1解码后编回去
3.4. 处理过程
下面分析两个有代表性的例子,说明java对编码有关问题的处理方法。
3.4.1. 表单输入
User input *(gbk:d6d0 cec4)
browser *(gbk:d6d0 cec4)
web server iso8859-1(00d6 00d 000ce 00c4) class,
需要在class中进行处理:
getbytes("iso8859-1")为d6 d0 ce c4,
new String("gbk")为d6d0 cec4,
内存中以unicode编码则为4e2d 6587。
l 用户输入的编码方式和页面指定的编码有关,也和用户的操作系统有关,所以是不确定的,上例以gbk为例。
l 从browser到web server,可以在表单中指定提交内容时使用的字符集,否则会使用页面指定的编码。而如果在url中直接用?的方式输入参数,则其编码往往是操作系统本身的编码,因为这时和页面无关。上述仍旧以gbk编码为例。
l Web server接收到的是字节流,默认时(getParameter)会以iso8859-1编码处理之,结果是不正确的,所以需要进行处理。但如果预先设置了编码(通过request. setCharacterEncoding ()),则能够直接获取到正确的结果。
l 在页面中指定编码是个好习惯,否则可能失去控制,无法指定正确的编码。
3.4.2. 文件编译
假设文件是gbk编码保存的,而编译有两种编码选择:gbk或者iso8859-1,前者是中文windows的默认编码,后者是Linux的默认编码,当然也可以在编译时指定编码。
Jsp *(gbk:d6d0 cec4)
java file *(gbk:d6d0 cec4)
compiler read uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)
compiler write utf(gbk: e4b8ad e69687; iso8859-1: *)
compiled file unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) class。
所以用gbk编码保存,而用iso8859-1编译的结果是不正确的。
class unicode(4e2d 6587) system.out / jsp.out gbk(d6d0 cec4) os console / browser。
l 文件可以以多种编码方式保存,中文windows下,默认为ansi/gbk。
l 编译器读取文件时,需要得到文件的编码,如果未指定,则使用系统默认编码。一般class文件,是以系统默认编码保存的,所以编译不会出问题,但对于jsp文件,如果在中文windows下编辑保存,而部署在英文linux下运行/编译,则会出现问题。所以需要在jsp文件中用pageEncoding指定编码。
l Java编译的时候会转换成统一的unicode编码处理,最后保存的时候再转换为utf编码。
l 当系统输出字符的时候,会按指定编码输出,对于中文windows下,System.out将使用gbk编码,而对于response(浏览器),则使用jsp文件头指定的contentType,或者可以直接为response指定编码。同时,会告诉browser网页的编码。如果未指定,则会使用iso8859-1编码。对于中文,应该为browser指定输出字符串的编码。
l browser显示网页的时候,首先使用response中指定的编码(jsp文件头指定的contentType最终也反映在response上),如果未指定,则会使用网页中meta项指定中的contentType。
3.5. javaEE几处设置
对于web应用程序,和编码有关的设置或者函数如下。
3.5.1. jsp编译
指定文件的存储编码,很明显,该设置应该置于文件的开头。例如:<%@page pageEncoding="GBK"%>。另外,对于一般class文件,可以在编译的时候指定编码。
3.5.2. jsp输出
指定文件输出到browser时使用的编码,该设置也应该置于文件的开头。例如:<%@ page contentType="text/html; charset= GBK" %>。该设置和response.setCharacterEncoding("GBK")等效。
3.5.3. meta设置
指定网页使用的编码,该设置对静态网页尤其有作用。因为静态网页无法采用jsp的设置,而且也无法执行response.setCharacterEncoding()。例如:
如果同时采用了jsp输出和meta设置两种编码指定方式,则jsp指定的优先。因为jsp指定的直接体现在response中。
需要注意的是,apache有一个设置可以给无编码指定的网页指定编码,该指定等同于jsp的编码指定方式,所以会覆盖静态网页中的meta指定。所以有人建议关闭该设置。
3.5.4. form设置
当浏览器提交表单的时候,可以指定相应的编码。例如: