论述题 6.  怎样实现将GB2312编码的字符串转换为ISO8859-1编码?
【正确答案】编码是一个非常重要的概念,尤其在网络传输中。通过网络传输一个字符串的流程如下:发送方把字符串转换成byte序列进行传输,接收方接收到byte序列后,需要把byte序列转换成字符串。也许有人认为这个工作非常简单,假如要传输字符串string s="中国";,只需要调用s.getBytes()方法就可以把字符串转换为byte数组进行发送,接收方接收到这个byte数组b后,再调用new String(b)就可以转换为字符串。getBytes()方法采用系统默认的编码方式把字符串转换为byte数组,new String(b)采用系统默认的编码方式把byte数组转换为字符串。采用这种方法,当发送方与接收方所在系统默认的编码方式不同时,就会出现乱码。因此,在这种情况下需要使用另外一套接口来显式地指定编码方式,假设字符串采用utf-8的编码方式,可以采用下面的写法保证在任何情况下都能正确运行:
   发送方通过调用s.getBytes("utf-8")方法使用utf-8编码方式把字符串编码为字节流,接收方接收到字节流后,使用new String(b, "utf-8")方法进行解码,转换为字符串。
   当然,各个编码之间可以相互转换,只不过以A方式编码的字符串转换为以B方式编码的内容后可能会有乱码,如下代码的功能是把GB2312编码的字符串转换为ISO8859-1编码:
   public class Test
   {
   public static void main(String[]args)throws Exception
   {
   //这是一个用GB2312编码的字符串
   String gb=new String("中国".gecBytes(),"gb2312");
   System.out.println(gb);
   //把GB2312编码的字符串改为用ISO8859-1编码
   //需要先用GB2312解码,然后用ISO8859-1编码,采用新的编码可能会有乱码
   String ios=new String(gb.getBytes("gb2312"),"ISO-8859-1");
   System.out.println(ios);
   //再转换回用GB2312编码,不会有乱码
   gb=new String(ios.getBytes("ISO-8859-1"),"gb2312");
   System.out.println(gb);
   }
   }
   程序的运行结果为:
   中国
   ???..2
   中国
【答案解析】