Java中的byte char String 编码 解码

char

人能识别的字符,在Java中用Unicode表示,占两个字节,可以表示中文。在jvm中,它的值是唯一的,可以用数字表示:

char a1 ='周';
char a ='\u5468'; //Unicode
char aa =0x5468; //十六进制
char aaa = 21608; //十进制
System.out.println(a1);
System.out.println(a);
System.out.println(aa);
System.out.println(aaa);
输出:
周
周
周
周

 打印所有char

int u=0;
for(int i=0; i<=0xffff; i++){
	System.out.print((char)i);
	u++;
	if(u==100){
		System.out.println();
		u=0;
	}
}

 

 

String 

字符串 本质上就是char[]

String a='中国人4';
System.out.println(a.length);
输出:4

 

 

byte[]

计算机能识别的二进制字节,用于CPU计算、存储或网络传输,一个byte有8位(bit)

 

编码

为什么要编码,Jvm中char可以当做数字来进行运算,每个char占两个字节非常便于CPU计算。但是用作IO传输或存储就显得字节臃余,也不能容错。

想象一下发送电报把一句话(String)变成二进制电文(byte[])叫编码,使用不同的编码表(Charset)产生的二进制电文不一样。 

String str ="a中c";
byte[] bytes = str.getBytes("utf-8");
for(byte b : bytes){
	System.out.print(b+",");
}
输出:97,-28,-72,-83,99,

 

String str ="a中c";
byte[] bytes = str.getBytes("gb2312");
for(byte b : bytes){
	System.out.print(b+",");
}
输出:97,-42,-48,99,

 

String str ="a中c";
byte[] bytes = str.getBytes("gbk");
for(byte b : bytes){
	System.out.print(b+",");
}
输出:97,-42,-48,99,   说明gbk与gb2312是部分兼容的

 

String str ="a中国c";
byte[] bytes = str.getBytes("ascii");
for(byte b : bytes){
	System.out.print(b+",");
}
输出:97,63,63,99, 对于超出范围的字符用63表示

  

解码

将电文(byte[])翻译成一句话(String),使用的解码表(Charset)必须和编码的一样

String str ="a中国c";
byte[] bytes = str.getBytes("ascii");
String newStr = new String(bytes, "ascii");
System.out.println(newStr);
输出:a??c

 

 

参考:https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

猜你喜欢

转载自oracle-api.iteye.com/blog/2382590