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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨文宇 中级黑马   /  2012-8-5 16:15  /  2136 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨文宇 于 2012-8-5 16:22 编辑

import java.util.Arrays;
class Test
{
public static void main(String[] args) throws Exception
{
        String data = "你好";
System.out.println(data);
  byte[] bs = data.getBytes( "GBK" );
        System.out.println( Arrays.toString( bs ) );
  String str = new String( bs , "UTF-8" );
        System.out.println( str );
}
}

GBK每个字符占两个字节,UTF-8占三个字节,那为什么这里把GBK的字节转换成UTF-8字符时反而变成3个字符了?

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

3 个回复

正序浏览
本帖最后由 李龙276596456 于 2012-8-5 17:58 编辑

刚才做试验时,尝试出一个有趣的小例子,你可以看一下:
String data = "浣爭";
System.out.println(data);
byte[] bs = data.getBytes( "GBK" );
System.out.println( Arrays.toString( bs ) );
String str = new String( bs , "UTF-8" );
System.out.println( str );
打印结果如附件图
其中比较凑巧的是,“你”在UTF-8的编码是【-28,-67,-96】
浣在GBK的编码是【-28,-67】
爭在GBK的编码是【-96,-114】

huan.jpg (3.39 KB, 下载次数: 5)

huan.jpg
回复 使用道具 举报
首先byte[] bs = data.getBytes( "GBK" );这行代码已经将上述字符串解码成字节数组,这之后基本就可以说和你原来的字符出没有什么关系了,
System.out.println( Arrays.toString( bs ) );   是打印出一个字节数组的各个元素值,即【-60,-29,-70,-61】
刚才你提到的“GBK每个字符占两个字节,UTF-8占三个字节”,这个是不完全正确的,因为英文字母在任何编码集里貌似都是一字节,
所以String str = new String( bs , "UTF-8" );  这行代码在对字节数组重新编码的时候,他不清楚他是什么,英文还是中文,它只是尝试着去编码,
最后它只得到了3个字符,
你可以做以下的试验:字节数组为左边一列,利用String str = new String( bs , "UTF-8" );  进行编码
【-60,-29,-70,-61】 为3个字符,
【-60,-29,-70】     为2个字符,
【-60,-29】     为2个字符,
【-60】     为1个字符,
【-29,-70】     为1个字符

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. public static void main(String[] args) throws Exception
  2. {
  3.         String data = "你好";
  4. System.out.println(data);
  5.   byte[] bs = data.getBytes( "GBK" );
  6.         System.out.println( Arrays.toString( bs ) );
  7.   String str = new String( bs , "UTF-8" );
  8. /*
  9. 此处的bs已经被GBK编码为一个数组了,并非直接编码的字符串“你好”。
  10. 所以JVM不认识它认为bs是一个字符,无法对其UTF-8转码所以下面输出是:???
  11. */
  12.         System.out.println( str );
  13. }
复制代码
若要进行转码,可以先对bs按GBK转码回去,再按照UTF-8进行转码。
或者直接对data进行转码。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马