java中的字符集的编码

来源:互联网 发布:电商美工设计 编辑:程序博客网 时间:2024/05/01 08:44

计算机中所有数据全部都用二进制数表示,将一个字符转换成为二进制数的过程叫做编码,对应的规则,怎么转换,就是一个编码系统,常用的编码系统有这么几种:

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虚拟机和系统平台下的编解码

 

 

 

 

 

原创粉丝点击