1.System.in是一个输入流对象,这个输入流使用的默认字符编码集是GB2312
从键盘上读取到的每一个字符(例如中国),操作系统读取时就是读取若干个整数(有些整数用一个字节存放(ASCII)而有些整数用两个字节存
放(中文字符)并且你要知道一个数字对应一个字符这就是字符集),计算机系统将这些整数再与本地字符编码集(GB2312)进行匹配 以此来辨别
输入的是哪些字符。
2.再来Unicode字符集中的字符都是占用两个字节的,Unicode中的ASCII码也一样,例如在ASCII码中a对应的整数是97转化为16进制就是61,而
在Unicode码中a对应的16进制整数是 0061, 就是两个字节了,只是第一个字节的8位二进制数是00000000也就是十六进制的00,所以0061就是
两个字节,也就是说如果使用Unicode的系统读取到的是一个字节的整数它就会当成是ASCII码在前面加上00,将这个数据提升为两个字节
然后来看看你的问题
InputStreamReader isr=new InputStreamReader(System.in,"gb2312");
/*
键盘对应系统输入流默认的编码是GB2312,所以你输入"中国"时,系统会读取到d6d0(中)和b9fa(国),然后用一个字符输入流
new InputStreamReader(System.in,"gb2312");来包装,所以这时就要将d6d0 b9fa(整数)转换为gb2312中对应的字符"中国"
存放到字符输入流中。 String strLine=br.readLine();所以当你从字符输入流中读取数据时就会读取到"中国"这
两个字符(即String strLine = "中国") 也就是说 System.out.println(strLine) = System.out.println("中国")
所以打印出 中国,然后就是这句Integer.toHexString(strLine.charAt(i))就是将字符转为编码集中对应的整数再
将整数转为16进制整数,因为java中使用的是Unicode编码集,这个编码集中也含有"中国"这两个字符,在Unicode中
"中国"对应的16进制整数就是4e2d 56fd,所以打印出来的是Unicode码
*/
InputStreamReader isr=new InputStreamReader(System.in,"iso8859-1");
/*
按照上面所说的,因为iso8859-1中没有读取到的d6d0 b6fa对应的字符,当要将d6d0 b9fa转换为iso8859-1中对应的字符时得到
的字符就是火星文也就是乱码....
这里是重点哦:上面由d6d0 b9fa得到了iso8859-1的字符虽然是火星文,但是也是有大小的,每个火星文占用1个字节,
因为iso8859-1中的字符都是1个字节的,所以代码String strLine = ??XX(乱码)
Integer.toHexString(strLine.charAt(i))当你用一个字节的火星文来转换成Unicode码时,
系统会将火星文(d6 d0 b9 fa)当作是4个ASCII码,so~java虚拟机 会在这4个ASCII码前面加上一个字节也就是00,
再用System.out.println()打印出来就是00d6 00d0 00b9 00fa。注意这不是GB2313码喔,是Unicode码吗?这我也不知道了
System.out.println(strLine)最后这一句也跟上面一样的道理System.out.println(strLine)=System.out.println("??xx")
回答完毕,这是我自己的理解不知道对不对,希望对你有帮助
*/ |