[code]
String str = "中国";
打印他的unicode 编码
for(int i=0;i< str.length;i++){
System.out.println(Integer.toHexString((int)str.charAt(i))); //我们得到的char都是Unicode类型的,在没有转换之前都是Unicode类型
}
输出的结果是:
4e2d
56fd
Byte[] buf = str.getBytes("gb2312"); //这是按照转换成gb2312的编码,放入buf中
for(int i=0;i<buf.length;i++){
System.out.println(Integer.toHexString(buf[i]));
//注意:Integer.toHexString是接受一个Int,但是传给他一个byte,那么他会自动补全前三个字节,如果是正数,用0补,是负数,用1补
}
输出的结果是:
ffffffd6
ffffffd0
ffffffb9
fffffffa
for(int i=0;i<buf.length;i++){
System.out.write(buf[i]); //写入到屏幕缓冲区中
}
System.out.println();//只是为了让他调用刷新函数
输出的内容为: 中国 ----//这一点告诉我们如果想要显示到屏幕上,那么放入的字符一定要是本地字符
System.out.println("中国");//这个也能打印中国
因为System.out 是PrintStream的实例对象
PrintStream.println(String str);实际上会把中国现转换成国标码然后在加到底层输出流中,所以这个方法调用了 getBytes然后再调用了write方法
注意:这个System.out.write(buf,0,4);//这个会刷新缓冲区哦,因为人家写了多个嘛
那么怎么查看本地字符集呢?
因为这些属性都是JVM的缺省属性,所以看 System.getProperties()方法
System.getProperties().list(System.out);//把JVM属性列表到屏幕上
其中有一项file.encoding=GBK就是我们要查看的
System.setProperty("file.encoding","iso8859-1");//我们手动设置了JVM的环境属性
new String(buf,0,len);会把buf这个字节数组按照本地字符集大字典,转换成Nnicode码,因为String 永远是Unicode的
new String(buf,0,len,"gb2312");//这个他认为buf是gb2312,所以他把这个东西按照gb2312来转换成Unicode码,也就是他先找到这个buf对应的实际的字,然后再找到Unicode的这个字,然后再找到Unicode这个字对应的Unicode码,简单一点就是找到buf的文字,然后JVM会自动对照转成Unicode,为了很好的记忆并简化理解,我们通常把buf到String的过程称为解码。。。这里是按照本地字符集解码
如果我们知道他是用的什么解码,而他解码出来是乱码,那么他肯定解码错了,
所以我们通常再编码回去。。。。byte[] buf = str.getBytes("iso8859-1");//这里是已知他用iso8859-1解码错误,所以我们再编码回去
这样就可以得到原始的字节数组,再解码一次呗
new String(buf,0,len,"gb2312");
[/code]
String str = "中国";
打印他的unicode 编码
for(int i=0;i< str.length;i++){
System.out.println(Integer.toHexString((int)str.charAt(i))); //我们得到的char都是Unicode类型的,在没有转换之前都是Unicode类型
}
输出的结果是:
4e2d
56fd
Byte[] buf = str.getBytes("gb2312"); //这是按照转换成gb2312的编码,放入buf中
for(int i=0;i<buf.length;i++){
System.out.println(Integer.toHexString(buf[i]));
//注意:Integer.toHexString是接受一个Int,但是传给他一个byte,那么他会自动补全前三个字节,如果是正数,用0补,是负数,用1补
}
输出的结果是:
ffffffd6
ffffffd0
ffffffb9
fffffffa
for(int i=0;i<buf.length;i++){
System.out.write(buf[i]); //写入到屏幕缓冲区中
}
System.out.println();//只是为了让他调用刷新函数
输出的内容为: 中国 ----//这一点告诉我们如果想要显示到屏幕上,那么放入的字符一定要是本地字符
System.out.println("中国");//这个也能打印中国
因为System.out 是PrintStream的实例对象
PrintStream.println(String str);实际上会把中国现转换成国标码然后在加到底层输出流中,所以这个方法调用了 getBytes然后再调用了write方法
注意:这个System.out.write(buf,0,4);//这个会刷新缓冲区哦,因为人家写了多个嘛
那么怎么查看本地字符集呢?
因为这些属性都是JVM的缺省属性,所以看 System.getProperties()方法
System.getProperties().list(System.out);//把JVM属性列表到屏幕上
其中有一项file.encoding=GBK就是我们要查看的
System.setProperty("file.encoding","iso8859-1");//我们手动设置了JVM的环境属性
new String(buf,0,len);会把buf这个字节数组按照本地字符集大字典,转换成Nnicode码,因为String 永远是Unicode的
new String(buf,0,len,"gb2312");//这个他认为buf是gb2312,所以他把这个东西按照gb2312来转换成Unicode码,也就是他先找到这个buf对应的实际的字,然后再找到Unicode的这个字,然后再找到Unicode这个字对应的Unicode码,简单一点就是找到buf的文字,然后JVM会自动对照转成Unicode,为了很好的记忆并简化理解,我们通常把buf到String的过程称为解码。。。这里是按照本地字符集解码
如果我们知道他是用的什么解码,而他解码出来是乱码,那么他肯定解码错了,
所以我们通常再编码回去。。。。byte[] buf = str.getBytes("iso8859-1");//这里是已知他用iso8859-1解码错误,所以我们再编码回去
这样就可以得到原始的字节数组,再解码一次呗
new String(buf,0,len,"gb2312");
[/code]