Look into it ~

          present
          隨筆 - 32, 文章 - 0, 評論 - 3, 引用 - 0

          導航

          <2008年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          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

          主站蜘蛛池模板: 澎湖县| 冀州市| 延安市| 遂溪县| 新昌县| 克拉玛依市| 隆昌县| 神木县| 阜平县| 固始县| 仁寿县| 西充县| 天祝| 屏东市| 葫芦岛市| 夏河县| 屏边| 崇文区| 梨树县| 芮城县| 阿合奇县| 古浪县| 龙陵县| 西充县| 安徽省| 昌江| 兴义市| 宜丰县| 海晏县| 新密市| 巴林左旗| 北京市| 新蔡县| 晋宁县| 南京市| 安阳县| 武定县| 会昌县| 海丰县| 延安市| 温宿县|