您的位置:首页 > 其它

UTF-8 GBK ISO-8859-1编码

2013-07-27 10:59 197 查看
1. sData.getBytes();和sData.getBytes("gbk")作用是一样(如果你是中文系统的话) 因为中文系统内码(即默认编码)一般是GBK。而getBytes()的意思是把串生成某个编码的字节流,并转换成byte数组。

2.sData = new String(sData.getBytes("iso8859-1"), "gbk");

这句的意思是告诉 java,请把它生成ISO-8859-1编码的字节流数组,在new String的时候传入GBK这个参数,告诉编译器这个byte数组其实是以gbk编码的,这样new String的时候编译器就可以正确的把它转换成Unicode了,因为java中string是unicode编码的

3.sData = new String(sData.getBytes("gbk"), "UTF8");

为什么这样写不对呢?先说new String(sData.getBytes("iso8859-1"), "gbk");。先看你把文件内容读到String中的时候,你需要告诉Java把你文件内容看作是ISO-8859-1编码的(其实是GBK或Unicode或其他),而因为ISO-8859-1是一个字节的,所以读文件内容并转换为sData的时候,java只是把每个字节前加 0x00组成unicode,所以后来当用这句sData.getBytes("iso8859-1")都可以解析出原来的字节,就是说信息不会丢失,因为只是把0x00去掉而已。(这个过程就好象加密解密)但是注意这串字节流实际上不是ISO-8859-1的(但java并不知道)。

而GBK是1-2字节的,如果你文件是UTF-8(1-6字节),那么你告诉java这个文件内容是GBK的,java就以GBK编码去读入这串字节流,但是这里会发生信息丢失或错乱,因为这个字节流并不是GBK的,而是UTF-8的,然后再用new String(sData.getBytes("gbk"), "UTF8");显然就恢复不了了。

你可以做个试验保存个GBK的文件,用UTF-8去读,然后new String(sData.getBytes("UTF-8"), "GBK");也肯定是不行的。所以只有ISO-8859-1才可以这么做



GBK和Unicode都兼容ISO-8859-1,但这并不是 new String(sData.getBytes("iso8859-1"), "gbk");可以运行的原因。因为在从文件读入的时候,其实就已经按ISO-8859-1编码读入那些中文了,ISO-8859-1并不兼容GBK,所以按兼容来解释的话,那么这里就应该已经出错了。但是事实上并没有出错,但是因为ISO-8859-1是单个字节的,它把每个字节认作一个字符读入,这样不会丢失信息。

也就是说比如:你的文件内容是“hello你好"那么java以ISO-8859-1读入的时候,会认为这里有9个字符,然后转换为Unicode(String是unicode的),还是9个字符但是就变成18个字节了。

然后用sData.getBytes("ISO-8859-1"),还是可以恢复成原来的摸样,仍然是9个字节。

这样字节信息没有丢失,于是就可以顺利的以GBK解析并把它转换成java中的String。



---------------------------------------------------------------------------------------------------------------------------

从本质上说,ISO-8859-1是单字节编码,自身不能显示中文,若要显示中文,必须和其他能显示中文的编码配合,如“GBK”,“UTF-8",

以ISO-8859-1编码的文本,都以bytes[]的形式保存,若要显示中文,只需以显示平台的默认编码格式进行解码即可。若仍然以ISO-8859-1格式解码,得到的中文字符肯定是乱码,因为ISO-8859-1自身不能显示中文。



Java内部字符串String用得都是是Unicode编码,所以Java内部的字符串可以说是没有编码的,,只有bytes[]有编码!但是java平台是有编码的,编码为平台(操作系统)默认编码,但是对于别的平台如数据库、文件、网页(浏览器)等,编码不一样!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: