资源描述:
《jsp,servlet编码问题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编码与解码电脑只能处理011001这样的二进制数字,字符是日常生活中我们使用的符号,为了电脑能够存储、传输和展示字符,所以,我们需要把字符转换为0110000这样的二进制码。这就是所谓编码。相反,把011000这样的二进制码转换为字符的过程就是解码!JAVA里,char表示一个字符,String表示字符串!具体把哪个字符映射到哪个二进制串上,是由国家(国家标准)、国际组织(国际标准)等决定的!一般不用二进制串来表示某个字符的编码(因为写起来、阅读起来都很麻烦),所以一般是用十六进制的串来表示某个字符的编码。因此:字符<-->十六进制串,之间的映射的集合(因为有很多字符),就构
2、成了字符集。你经常见到的字符集是:Unicode、UTF-8、GB2312、GB18030、GBK、Big-5、ISO-8859-1(又名:Latin-1)Unicode、UTF-8能够支持目前世界上所有语言文字的字符GB2312是旧的国家标准,不支持繁体汉字GBK不是国家标准,但支持繁体汉字GB18030是新的国家标准,也支持繁体汉字Big-5,能支持繁体汉字ISO-8859-1,不支持汉字,英美等拉丁语系的国家常用这个编码举例:publicclassEncodingTest01{publicstaticvoidmain(String[]args)throwsExcepti
3、on{Strings="中国";byte[]bs=s.getBytes("GB18030");System.out.println(Utils.byteArrayToHex(bs));}}publicclassUtils{privatestaticchar[]hexDigits={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};publicstaticStringbyteArrayToHex(byte[]bs){StringBuffersb=newStringBuffer();for(byteb
4、:bs){sb.append(hexDigits[(b>>4)&0x0000000F]);sb.append(hexDigits[b&0x0000000F]);sb.append(",");}returnsb.toString();}}“中国”,这两个简体汉字,在不同的字符集中,用上述程序输出,其编码分别为:Unicode–FE,FF,4E,2D,56,FD,UTF-8-E4,B8,AD,E5,9B,BDGB18030-D6,D0,B9,FA,ISO-8859-1-3F,3F,解释:关于Unicode用Unicode编码之后的“中国”,其编码的前面有FE,FF两个额外的字节。
5、这两个字节称为BOM(ByteOrderMark)。“中”这个汉字,它的Unicode编码是:4E,2D,那么在传输的过程中,是把4E放在前面,还是把2D放在前面呢?这有BOM来决定。如果BOM是FEFF(称为BigEndian),表示4E在前;如果BOM是FFFE(称为LittleEndian),表示2D在前。也就是说,如果你的文件编码是Unicode(也可以叫做UTF-16),那么文件开头的字节就是:FEFF(以这种方式开头的编码叫UTF-16BE)或FFFE(以这种方式开头的编码叫做UTF-16LE)UTF-16BE、UTF-16、Unicode是一样的!关于UTF-8
6、UTF-8编码的文件,其文件头也有一段标识:EFBBBF其它编码的文件,其文件头没有什么标识!!!对于使用ISO-8859-1编码方式来对“中国”二字进行编码之后,得到的是:3F3F,这是因为ISO-8859-1字符集中根本就没有“中国”这两个字符!所以,它用3F来代替!解码解码,实际上就是把二进制流(也就是字节流,即字节数组)转换为字符。字节数组是什么样的编码(即用哪个字符集对它编码),你必需使用相同的字符集来解码!publicclassEncodingTest02{publicstaticvoidmain(String[]args)throwsException{byte
7、[]bs={(byte)0xD6,(byte)0xD0,(byte)0xB9,(byte)0xFA};Strings=newString(bs,"GB18030");System.out.println(s);}}像上述程序所示的那样,我们知道:D6D0B9FA是“中国”两个字符的“GB18030”编码,所以,你可以使用这个字符集来把其对应的字节数组解码为字符!Java中的字符你首先要理解的是,JAVA可以把字符存储在内存中(即也是以0110010这样的方式存储在内存中)!那么,JAVA把字符存储在内存