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

为什么str.getBytes("gbk")拿到的不是正确的gbk编码?
"秋"字, 使用工具查询的GBK编码是 C7 EF。
C7 EF转换成10进制数是 199 239

Java code

String s = "秋";
byte[] b = s.getBytes("gbk");
for(int i=0; i<b.length; i++)
{
    System.out.println(b[i]);
}



结果输出的不是 199 239 而是 -57 -17
请问这是怎么回事?中间到底发生了什么?为什么结果不正确?

------解决方案--------------------
byte 最大值127 所以是-的
------解决方案--------------------
c7转为二进制:1100 0111,你输出的时候,系统会把这个看为一个整数,最高位为1,那就是一个负数。

1100 0111是补码,转为反码1100 0110,再转为原码1011 1001=-(1+8+16+32)=-57
------解决方案--------------------
Java code

String s = "秋";
        byte[] b = s.getBytes("gbk");
        for (int i = 0; i < b.length; i++) {
            System.out.println(Integer.toHexString(b[i]&0xFF));
            System.out.println(Integer.toBinaryString(b[i]&0xFF));
        }

输出:
c7
11000111 //-57的二进制补码
ef
11101111