查看完整版本: utfToGBK

bufegar 2007-4-6 14:01

utfToGBK

平时如果用GBK在很多地方不对被支持(不是乱码,只是外码显示不支持),比如生成图片你就不能直接drawString("中文");要转换成UTF,那个gbToUtf8()方法我已经介绍过多次了.

但昨天遇到了一个问题,就是源文件是UTF的,要转换成GB2312,这种情况其实也很多,比如我们访问的WEB页面是utf字符集,这时我们一定要手工把浏览器字符集设为UTF才正常.那么如果把UTF直接转换成GB2312的编码,在网上穷找了N小时没有任何资料,没办法,自己动手吧.

每个UTF字符,如果值在0x0001到0x007F这间就是一个byte,在0x007F互0x07FF之间就是两个
byte,如果大于0x07FF就是三个byte,所以汉字都是三个byte,但我们不有把得到的byte每三个进行一次转换,因为有可能是中文,英文,标点混在一起的,所以要计算值,特烦.
[java]
  public static byte[] utfToGBK(byte[] srcByte,String encoding) throws UTFDataFormatException{
    StringBuffer str = new StringBuffer();
    int len = srcByte.length;
    int char1, char2, char3;
    int count = 0;
    while (count < len) {
      char1 = (int) srcByte[count] & 0xff;
      switch (char1 >> 4) {
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
          count++;
          str.append( (char) char1);
          break;
        case 12:
        case 13:
          count += 2;
          if (count > len) {
            throw new UTFDataFormatException();
          }
          char2 = (int) srcByte[count - 1];
          if ( (char2 & 0xC0) != 0x80) {
            throw new UTFDataFormatException();
          }
          str.append( (char) ( ( (char1 & 0x1F) << 6) | (char2 & 0x3F)));
          break;
        case 14:

          /* 1110 xxxx  10xx xxxx  10xx xxxx */
          count += 3;
          if (count > len) {
            throw new UTFDataFormatException();
          }
          char2 = (int) srcByte[count - 2];
          char3 = (int) srcByte[count - 1];
          if ( ( (char2 & 0xC0) != 0x80) || ( (char3 & 0xC0) != 0x80)) {
            throw new UTFDataFormatException();
          }
          str.append( (char) ( ( (char1 & 0x0F) << 12) |
                              ( (char2 & 0x3F) << 6) |
                              ( (char3 & 0x3F) << 0)));
          break;
        default:
          throw new UTFDataFormatException();
      }
    }
    String temp = new String(str);
    try{
      if(encoding==null) encoding = "GBK";
      return temp.getBytes(encoding);
    }catch(Exception e){
      return null;
    }
  }

[/java]
好了,现在如果你从UTF文件或其它的UTF流中读到byte后可以直接得到指定的字符集的BYTE了.如果要返回String,直接new String(byte[])就行了,我没有直接返回String,是因为有人会直接从StringBuffer那一步new String,这不行,这时内存中的编码还是UNCODE的,要getBytes("GBK")得到的才是你要的byte.
页: [1]
查看完整版本: utfToGBK