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

          主站蜘蛛池模板: 休宁县| 怀来县| 兴文县| 珠海市| 荆州市| 普兰店市| 开阳县| 体育| 区。| 磴口县| 嘉义市| 淮北市| 临清市| 永定县| 万安县| 宁化县| 调兵山市| 靖安县| 延庆县| 富源县| 西昌市| 上饶市| 林口县| 临西县| 台中市| 汝南县| 三江| 陇川县| 繁昌县| 班戈县| 浦东新区| 砚山县| 绩溪县| 叙永县| 久治县| 祁门县| 莱芜市| 仙游县| 奉节县| 曲周县| 黄浦区|