一个实例:
// 该java类默认为gb2312编码
String str="你好abc";
System.out.println("原串:"+str);
byte[] bytes1=str.getBytes();//byte为8bit,-128到127
System.out.print("gb2312: ");
for(byte b:bytes1){
System.out.print(Integer.toHexString(b&0xff)+" ");
}
System.out.println();
System.out.print("gbk: ");
byte[] bytes2=str.getBytes("gbk");
for(byte b:bytes2){
System.out.print(Integer.toHexString(b&0xff)+" ");
}
System.out.println();
System.out.print("utf-8: ");
byte[] bytes3=str.getBytes("utf-8");
for(byte b:bytes3){
System.out.print(Integer.toHexString(b&0xff)+" ");
}
System.out.println();
System.out.print("utf-16be:");
byte[] bytes4=str.getBytes("utf-16be");
for(byte b:bytes4){
System.out.print(Integer.toHexString(b&0xff)+" ");
}
System.out.println();
System.out.print("ISO-8859-1:");
byte[] bytes5=str.getBytes("ISO-8859-1");
for(byte b:bytes5){
System.out.print(Integer.toHexString(b&0xff)+" ");
}
System.out.println();
String str2=new String(bytes2);
System.out.println(str2);
String str3=new String(bytes3);
System.out.println(str3);
String str4=new String(bytes4);
System.out.println(str4);
String str5=new String(bytes4,"utf-16be");
System.out.println(str5);
String str6=new String(bytes5,"ISO-8859-1");
System.out.println(str6);
打印结果:
分析:由上面例子可以知道中文“你好”根据各种字符编码标准得到的字节是不同的:
1)gb2312和gbk相同,两个字节表示一个中文,实际上gb2312只支持6763个汉字,不是所有汉字都可以使用gb2312编码,而gbk是兼容gb2312的,而且可以表示更多的中文字符;
2)utf-8用3个字节表示一个中文,一个字节表示一个字母;
3)utf-16be(即Unicode编码)则是中文和英文字符都是2个字节;
4)ISO-8859-1为单字节编码,范围0x00-0xff,从输出结果可以知道,因为“你”,“好”是中文,在码表中没有中文字符,字节都翻译为了3f,尽管在后面使用了iso-8859-1,翻译编码“3f 3f 61 62 63 ”只得到“??abc”,得不到原来的结果“你好”。ISO-8859-1为很多软件采用的默认编码,故而容易导致中文乱码
参考:点击打开链接