俊星的BLOG

          JAVA字符編碼

          測試代碼:
              public static void main(String[] args) {
                  Locale.setDefault(Locale.US);
                  String str 
          = "中G中";
                  String codes[] 
          = "iso8859-1""utf-8""utf-16""unicode""gbk""gb2312" };
                  
          try {
                      System.out.println(str);
                      System.out.println(
          "default code:" + System.getProperty("file.encoding"));
                      
          for (String s : codes) {
                          System.out.println(s 
          + "" + toHex(str.getBytes(s)));
                      }

                  }
           catch (UnsupportedEncodingException e) {
                      e.printStackTrace();
                  }

              }


              
          private static String toHex(byte[] buffer) {
                  StringBuffer sb 
          = new StringBuffer(buffer.length * 3);

                  
          for (int i = 0; i < buffer.length; i++{
                      sb.append(Character.forDigit((buffer[i] 
          & 0xf0>> 416));
                      sb.append(Character.forDigit(buffer[i] 
          & 0x0f16));
                      sb.append(
          " ");
                  }


                  
          return sb.toString();
              }

          輸出如下:
          中G中
          default code:GBK
          iso8859-
          1: 3f 47 3f 
          utf-
          8: e4 b8 ad 47 e4 b8 ad 
          utf-
          16: fe ff 4e 2d 00 47 4e 2d 
          unicode: ff fe 2d 4e 
          47 00 2d 4e 
          gbk: d6 d0 
          47 d6 d0 
          gb2312: d6 d0 
          47 d6 d0 

          相關說明:
          1、通過System.getProperty("file.encoding")獲取到當前JVM的默認字符編碼方式,如GBK
          2、iso8859-1則是應用于英文和歐洲其他語言的單字節編碼字符集,“3f”其實對應就是“?”。
          3、utf-8則是unicode編碼的一種轉換方式(Unicode Transformation Format),兼容于ASCII編碼,如對于中文則使用3個字節來存儲,對于英文使用一個字節存儲。
          4、utf-16是unicode編碼的另一種轉換方式,每個直接都采用2個字節來存儲,所以不兼容于ASCII;
                其中“fe ff”是Byte Order Mark(BOM)表示采用的編碼方式為utf-16。
          5、此處的unicode輸出和utf-16本質相同,只不過大小尾序的問題導致單個字節輸出順序相反;
                其中對于windows和linux平臺的utf-16默認采用小尾序(LE little Endion),mac平臺采用大尾。
          6、gbk和gb2312是中文字符集,對于每個字符均采用2個字節存儲,其中gbk兼容gb2312并且還可表示繁體。

          關于存儲字節的計算,假設現在有N個中文和M個英文字符,則如下的計算方式(編碼方式:字節數):
          GBK:2*N+M
          UTF-8:3*N+M
          UTF-16:2*(N+M+1)
          ISO8859-1:N+M

          posted on 2009-05-26 00:12 俊星 閱讀(222) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 宣恩县| 舒兰市| 祥云县| 台东市| 阿勒泰市| 灵川县| 香河县| 永寿县| 屯门区| 淮阳县| 贡觉县| 吴旗县| 西丰县| 石嘴山市| 莆田市| 嘉祥县| 浠水县| 天等县| 田林县| 台中市| 皮山县| 武宣县| 博爱县| 东宁县| 灵石县| 伽师县| 金阳县| 民丰县| 金堂县| 黔南| 肥城市| 海晏县| 晋中市| 寻乌县| 韩城市| 易门县| 莎车县| 香河县| 应用必备| 敦化市| 连州市|