计算机中所有数据全部都用二进制数表示,将一个字符转换成为二进制数的过程叫做编码,对应的规则,怎么转换,就是一个编码系统,常用的编码系统有这么几种:
ASCII码:基于常用的英文字符的一套电脑编码系统。英文中常使用的字符,数字符号被计算机以二进制码形式表现,出现,这种二进制码的集合就是所谓的ASCII码,每一个ASCII码与一个8位的二进制数对应,其最高位是0,相应的十进制数是0-127,如数字“0”是48,另外有128个扩展的ASCII码,最高位是1,有一些制表符和其他符号组成,现今最通用的单字节编码系统
ASCII码只能表示256种字符,其他国家语言怎么办??
GB2312:中国汉字编码,一个中文字符采用2个字节表示,为了和ASCII码有所区别,中文字符每一个字节的最高位都用1来表示
GBK:为了对更多的字符进行编码,除了兼容GB2312还对一些繁体中文,不常用的汉字和许多符号进行了编码
ISO-8859-1:是西方国家所使用的字符编码集,是一种单字节的字符集,而英文实际上只使用了小于128的部分
为了统一全世界所有的语言符号
产生了unicode编码,每一个字符都用2个字节来表示,对于英文字符采取前面加“0”字节的策略实现等长兼容,如a的ASCII码为0x61,unicode就为0x00,0x61
英文字符用两个字节表示,加大了传输的数据量
克服这个缺点:
UTF-8:一个7位的ASCII码值,对应的UTF是一个字节,如果字符是0x0000,或在0x0080与0x007f之间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的UTF码是三个字节。
字符之间的转换:
InputStreamReader和OutputStreamWrite
查看当前虚拟机中可以使用的字符集
java.nio.charset.*
class CharsetText
{
public static void main(String[] args) throws Exception
{
Map m=Charset.availableCharsets();
Set names=m.keySet();
Iterator it=names.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
//查看可以使用的编码集
Propertiex pps=System.getProperties() ;
pps.list(System.out) ;
//查看默认的编码集
pps.put(" file.encoding", " ISO-8859-1");//将缺省的编码方式改为ISO-8859-1
int data;
while((data=System.in.read())!='q')
{
buf[i]=(byte)data;//存储的是“英雄”的GBK码值
i++;
}
String str=new String(buf,0,i);//按照ISO-8859-1进行的解码
System.out.println(str);//出现乱码,
//out中文平台下按照GBK字符集创建的,打印时将字符串按照GBK编码然后打印
//修改
str.getBytes("ISO-8859-1");//编码回原来的字节数组
String strGBK=new String(str.getBytes("ISO-8859-1"),"GBK");//然后按照gbk解码
System.out.println(strGBK);
}
}
要分清楚java虚拟机和系统平台下的编解码