黑马程序员技术交流社区

标题: 关于转码问题 [打印本页]

作者: 杨文宇    时间: 2012-8-5 16:15
标题: 关于转码问题
本帖最后由 杨文宇 于 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个字符了?
作者: 郑文博    时间: 2012-8-5 17:00
  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进行转码。

作者: 黑马__李龙    时间: 2012-8-5 17:43
首先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个字符
作者: 黑马__李龙    时间: 2012-8-5 17:54
本帖最后由 李龙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, 下载次数: 6)

huan.jpg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2