为什么str.getBytes("gbk")拿到的不是正确的gbk编码?

chjioner1 2009-08-26 05:26:05
"秋"字, 使用工具查询的GBK编码是 C7 EF。
C7 EF转换成10进制数是 199 239


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


结果输出的不是 199 239 而是 -57 -17
请问这是怎么回事?中间到底发生了什么?为什么结果不正确?
...全文
611 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
chjioner1 2009-08-28
  • 打赏
  • 举报
回复
明白了,感谢大家
fskjb01 2009-08-26
  • 打赏
  • 举报
回复
嘿嘿,我也遇到过这样的难题!!
java1109 2009-08-26
  • 打赏
  • 举报
回复
MARK
南南北北 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bigbug9002 的回复:]
进了论坛就看见这贴子,不好意思了.
[/Quote]

虫子同学的j2se相当强,值得学习.
yanliang_xt 2009-08-26
  • 打赏
  • 举报
回复
再次学习。
justinavril 2009-08-26
  • 打赏
  • 举报
回复

public class TestGBK {

public static void main(String args[]){
String s = "秋";
try{
byte[] b = s.getBytes("gbk");

for(int i=0; i<b.length; i++)
System.out.println(b[i] & 0XFF);
}catch(Exception e){
e.printStackTrace();
}
}
}
bigbug9002 2009-08-26
  • 打赏
  • 举报
回复
进了论坛就看见这贴子,不好意思了.
南南北北 2009-08-26
  • 打赏
  • 举报
回复
就写个代码的工夫,这么多人回答,特别是虫子...每次都这么快.
justinavril 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yanliang_xt 的回复:]
学习你的错误。。。
这是经验。
有收获
哈哈
[/Quote]
Java隐藏的符号位扩展
lpzhaona 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bigbug9002 的回复:]
c7转为二进制:1100 0111,你输出的时候,系统会把这个看为一个整数,最高位为1,那就是一个负数。

1100 0111是补码,转为反码1100 0110,再转为原码1011 1001=-(1+8+16+32)=-57
[/Quote]

大虫子什么都明白...
南南北北 2009-08-26
  • 打赏
  • 举报
回复

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
yanliang_xt 2009-08-26
  • 打赏
  • 举报
回复
一个byte的负数强转为int型还为负,哈哈
bigbug9002 2009-08-26
  • 打赏
  • 举报
回复
如果把c7看为无符号数,就.
System.out.println(b[i]&0ff);

这样就把符号位屏蔽了。
bigbug9002 2009-08-26
  • 打赏
  • 举报
回复
实际的过程中会符号位扩展,变成32位。但结果是一样的。
yanliang_xt 2009-08-26
  • 打赏
  • 举报
回复
学习你的错误。。。
这是经验。
有收获
哈哈
bigbug9002 2009-08-26
  • 打赏
  • 举报
回复
c7转为二进制:1100 0111,你输出的时候,系统会把这个看为一个整数,最高位为1,那就是一个负数。

1100 0111是补码,转为反码1100 0110,再转为原码1011 1001=-(1+8+16+32)=-57
justinavril 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yanliang_xt 的回复:]
学习了。。
[/Quote]
你学啥了 我做错了

你真是梗死我了。。。
yanliang_xt 2009-08-26
  • 打赏
  • 举报
回复
学习了。。
justinavril 2009-08-26
  • 打赏
  • 举报
回复

public class TestGBK {
public static void main(String args[]){
String s = "秋";
try{
byte[] b = s.getBytes("gbk");

for(int i=0; i<b.length; i++)
{
System.out.println((int)b[i]);
}
}catch(Exception e){
e.printStackTrace();
}

}
}

hbgzg3006 2009-08-26
  • 打赏
  • 举报
回复
byte 最大值127 所以是-的

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧