Look into it ~

          present
          隨筆 - 32, 文章 - 0, 評論 - 3, 引用 - 0
          數據加載中……

          GB2312轉換Unicode

          之前的文章介紹了在j2me環境下GB2312轉換為UTF-8的方法。
          后來繼續對編碼及char類型進行學習,發現一些有趣的問題。
          首先java環境下的char類型變量,實際上就是以unicode方式存儲的。
          所以以下方法有效:

          輸入unicode編碼的byte數組,即可兩兩拼接成一個char。
          而String類型實際上就是在char數組的基礎上衍生出來的。大家可以參考cldc的源代碼。
          public static String read_Uni(byte[] word_unicode) {
                  StringBuffer stringbuffer 
          = new StringBuffer("");
                  
          for (int j = 0; j < word_unicode.length;) {
                      
          int l = word_unicode[j++];
                      
          int h = word_unicode[j++];
                      
          char c = (char) ((l & 0xff| ((h << 8& 0xff00));
                      stringbuffer.append(c);
                  }
                  
          return stringbuffer.toString();
              }


          j2me環境下也是如此。
          所以在第一次給出的轉換類中,提供的gb2312到utf-8直接轉換的快速方法。現在看來是畫蛇添足了。

          根據以上經驗,更新轉換類如下:
          public class HGB2312 {
           
                  
          private byte[] map = new byte[15228];
           
                  
          public HGB2312() throws Exception {
                      InputStream is 
          = getClass().getResourceAsStream("/gb2u.dat");
                      is.read(map);
                      is.close();
                  }
           
                  
          public String gb2utf8(byte[] gb) {
                      StringBuffer sb 
          = new StringBuffer();
                      
          int c, h, l, ind;
                      
          for (int i = 0; i < gb.length;) {
                          
          if (gb[i] >= 0) {
                              sb.append((
          char) gb[i++]);
                          } 
          else {
                              h 
          = 256 + gb[i++];
                              l 
          = 256 + gb[i++];
                              h 
          = h - 0xA0 - 1;
                              l 
          = l - 0xA0 - 1;
                              
          if (h < 9) {
                                  ind 
          = (h * 94 + l) << 1;
                                  c 
          = (byte2Int(map[ind]) << 8 | byte2Int(map[ind + 1]));
                                  sb.append((
          char) c);
                              } 
          else if (h >= 9 && h <= 14) {
                                  sb.append((
          char0);
                              } 
          else if (h > 14) {
                                  h 
          -= 6;
                                  ind 
          = (h * 94 + l) << 1;
                                  c 
          = (byte2Int(map[ind]) << 8 | byte2Int(map[ind + 1]));
                                  sb.append((
          char) c);
           
                              } 
          else {
                                  sb.append((
          char0);
                              }
                          }
                      }
                      
          return sb.toString();
                  }
           
                  
          private int byte2Int(byte b) {
                      
          if (b < 0) {
                          
          return 256 + b;
                      } 
          else {
                          
          return b;
                      }
                  }
              }


          這個方法明顯要比第一次快很多了,直接查表,然后拼接成String,不需要轉換成utf-8編碼。

          數據文件請在http://download.csdn.net/source/263609獲取

          總之,java中的char類型實際上是存儲了unicode編碼。目前在nokia 5300上測試通過。
          我覺得其它機器也應該是這樣。如果哪位大俠知道這方面的資料,請賜教。

          posted on 2008-08-15 14:58 LukeW 閱讀(614) 評論(0)  編輯  收藏 所屬分類: Tips, Tricks, Hints & Code

          主站蜘蛛池模板: 商河县| 巴马| 渝北区| 陆丰市| 沐川县| 湘乡市| 日照市| 昆山市| 达州市| 罗城| 益阳市| 洪泽县| 基隆市| 美姑县| 镇巴县| 贡山| 盱眙县| 焦作市| 灵宝市| 丰城市| 翼城县| 安福县| 大城县| 淮北市| 南城县| 五河县| 乐东| 陕西省| 苏尼特左旗| 祁连县| 乐都县| 衢州市| 云龙县| 吐鲁番市| 纳雍县| 永昌县| 五莲县| 永登县| 左云县| 临海市| 桐柏县|