一、编码表
1.ASCLL:美国标准信息交换码(用1个字节的7位表示)
2.ISO8859-1:拉丁码表,欧洲码表(用1字节8位表示)
3.GB2312:中国的中文编码表(2个字节表示)
4.GBK:中国的中文编码表升级,融合了更多的中文文字符号(2个字节表示)
5.Unicode: 国际标准码,融合了多种文字,所有文字和符号都用两个字节表示,Java用的就是Unicode
6.UTF-8:用1,2,3个字节表示字符。8-bit Unicode Transformation Format Unicode标准转化码,最少八位
二、在我们写程序,做开发的过程中经常在读写数据的时候会遇到乱码问题。我现在用的Eclipse的默认编码是GBK的,在读入UTF-8的文件时候会出现乱码现象。如何解决:
1.将文本文件的编码格式改一下,就是在文本文档中选择 ->文件
->另存为->GBK 或者ANSI
2.使用转换流读入写出 ,调用可以传入构造器的方法
new InputStreamReader( new FileReader("文件名"),"utf-8");
new OutputStreamWriter(new FileWriter("文件名"),"utf-8");
处理异常。你指定的编码表和文件的编码表一致。
三、出现问题的原因
以GBK字节为例:读入的时候是一个字节一个字节读入的,也就是一个八位一个八位的读入的,读入的时候文件变为字节流的形式,比如中文两个字节 : -45 -54 表示一个汉字 ,read()读入的时候返回他会用-45 -54 去GBK 中找到对应的汉字返回对应的int值,再转换显示出来。
因为字节是连续读入的查表的时候 GBK会两个字节两个字节的查,去查。
UTF-8: 可以用三个字节,两个字节,一个字节表示字符,比如
汉字用三个字节表示(如: -34 -34-22),数字用一个字节(00001111)表示, 所以UTF-8会有标志:111… 开头表示三个字节代表一个字符,读写时会向后再找两个字节凑够三个字节再去查找,同理110…10..表示两个字节代表一个字符,0…表示一个字节的字符,查表时会凑着再去查。
所以如果读入字节流为:
-34 -34-24 - 4 -4 -23
GBK 找的是:-34 -34 对应字符 ;-24 - 4对应字符 ;-4 -23对应字符三个字符。 而UTF-8 找到的可能只是-34 -34-24对应的字符和 - 4 -4 -23对应的字符两个,或其他四个五个。
因此会出现乱码问题