A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

汉字在gbk编码中被转换成字节之后变成什么了,一个汉字变成了两个负数,是什么怎么变的?
  1. package com.heima;

  2. public class 汉字的字符数量 {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 byte[] zifu = "a我是afdd好的".getBytes();
  8.                 char[] zifu1 = "a我是afdd好的".toCharArray();
  9.                 for (int i = 0; i < zifu1.length; i++)
  10.                         System.out.print(zifu1[i] + ",");
  11.                 System.out.println();
  12.                 for (int i1 = 0; i1 < zifu.length; i1++)
  13.                         System.out.print(zifu1[i1] + ",");
  14.         }

  15. }
复制代码
打印结果是
a,我,是,a,f,d,d,好,的,
97,-50,-46,-54,-57,97,102,100,100,-70,-61,-75,-60,

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

2 个回复

倒序浏览
其实很简单,一个字节才一个8位,一个字符是2个8位,在编码表里面有对应的数字和所代表的字符,你把你的字符变成字节之后,就变成另外的数据了,需要重新组合之后才能变成字符,但是你在程序里面把每一个字节都打印出来了,也就是有办法跟他原来一起的另外一个字节组合一起了,所以打印出来只能是一个个的数字了。至于说负数整数则也是因为汉字在字符集里面的位置决定的,靠后的字肯定对应的2进制数前面1比较多是不是?有1就容易首位是1成负数了。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
Tom 初级黑马 2012-12-29 11:11:58
藤椅
我想楼主应该是困惑在汉字的编码问题,以及char类型的字节数。
一个汉字占用两个字节,string.getBytes( )默认使用GBK字符集(GBK向下兼容GB-2312),返回来的字节范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间。从中可以看出,首字节一定为负数,而尾字节可正可负。所以你说的一个字符打印成两个负数是不正确的,只能说你所使用的例子是打印出两个负数。
一个char类型是由两个字节组成,与GBK编码一致,所以你最终打印的结果没有错误。
希望能对你有所帮助!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马