日期:2014-05-20  浏览次数:20714 次

关于BOM的问题
我将某些字符存在文本文档(.txt),unicode格式,用的是.getBytes("UTF-8");结果输出的是EFBFBD,按照道理应该是EF BB BF 啊
所以我想问,怎么回事?
还有就是存为.txt,utf-8格式,读出来的不符合unicode编码,也就是码位跟unicode上规定的不一样
怎么回事?


------解决方案--------------------
用Scanner还是Reader,原理都是一样的。
重点不是字节流和字符流的区别,用fileInputStream的时候我指定了编码方式:"UTF-16LE",这是重点。
关于 b & 0xFF:
b是一个byte,占8位。计算机中是用补码表示二进制的,比如FE,是111111110,这在byte中是个负数(-2),因为最高位符号位是1.
然后调用的是Integer.toHexString(int i) 这个方法,注意,参数是int类型。
现在b是byte,要转成int类型,那么就要做类型提升。我想这个大家都比较清楚,计算机组成原理,计算机导论等..学校讲的很多了,就是高位补符号位。
将8为二进制数1111 1110转成32位的int类型,就是高位用补符号位补足32位,结果是 1111 1111 1111 1111 1111 1111 1111 1110
算算这个负数的原码:负数的原码 = 补码-1 然后取反码。
1111 1111 1111 1111 1111 1111 1111 1110
 -) 0000 0000 0000 0000 0000 0000 0000 0001
---------------------------------------------
1111 1111 1111 1111 1111 1111 1111 1101
反) 1000 0000 0000 0000 0000 0000 0000 0010 (-2)

现在看看这个32位数的16进制表示,
1111 1111 1111 1111 1111 1111 1111 1110
F F F F F F F E
看到了吧,本来是FE,现在变成了FFFFFFFE
所以用Integer.toHexString()求一个byte的16进制表示先把这个整形的高24位清零。
注意:直接写0xFF,这在java中是一个int类型的数,也就是说他是一个正整数。
看看 b & 0xFF 是什么结果(由于0xFF是int,所以会先把b提升类型,然后再做计算)
1111 1111 1111 1111 1111 1111 1111 1110(byte类型的0xFE提升到int类型的表示)
&) 0000 0000 0000 0000 0000 0000 1111 1111 (int 类型的0xFF)
-------------------------------------------
0000 0000 0000 0000 0000 0000 1111 1110 
结果会把高位的0丢掉,没意义。所以最后结果是FE。
明白为什么要 b & 0xFF 了吧。

最后:关键是我开始那段文字,代码只是做个演示,你还是不明白的话,可以把你的代码贴上来,一起看看。