隨筆-199  評論-203  文章-11  trackbacks-0
           Java是使用Unicode字符集的,意思是在內存運行的時候是這樣的。當Java源程序被編譯為.class文件的時候,是以UTF-8字符集存儲字符的。比如字符串"漢語"的Unicode字符為:0x49 6C ED 8B。在.class文件中則變成了:0xE6 B1 89 E8 AF AD 0D 0A。實際上如果用以下程序輸出“漢語”二個字的16進制字節序列:

                  String str = "漢語";
                      

           

                  try{
          byte[] b = str.getBytes("Unicode");
          for(int i : b){
          System.out.println(Integer.toHexString(i));
          }       
          }catch(Exception ex){
          ex.printStackTrace();  }

              會發現,實際輸出的是 0xFE FF 6C 49 8B ED。多出來的0xFE FF,是Unicode字符串的BOM(Byte Order Mark)。但是為什么輸出的順序(0xFE FF 6C 49 8B ED)和文件中的順序不一致(0xFF FE 49 6C ED 8B)?

              public byte[] getBytes(Charset charset) 使用指定的字符集將此 String 解碼為字節序列,并將結果存儲到一個新的字節數組中。如果不指定參數,則使用系統默認的字符集,對于簡體中文系統一般為GBK。

              看程序:

          class EncodingExer 
          {
          public static void main(String[] args)
          {
          String str = "漢語";               //GBK編碼為: 0xBABA 0xD3EF
          byte[] b = str.getBytes();     
          for(int i : b){
          System.out.println(Integer.toHexString(i)); //0xBA 0xBA 0xD3 0xEF
          }    }}

              在這個過程中,由Unicode字符得到字符串“漢語”,然后解碼得到了GBK字節序列。與String.getBytes()相對應的是new String(byte[] bytes,Charset charset),它的作用是用字節序列生成字符串。如果想由剛才的GBK字節序列得到原來的字符串“漢語”,我們需要做的是:new String(b) 就可以了。將b按照GBK編碼得到字符串“漢語”,然后轉化為Unicode字符。如果是str.getBytes("iso-8859-1"),那么還原的時候就是new String(b,"iso-8859-1")。總之就是用什么方式編碼,就用什么方式解碼。

          posted on 2009-05-06 20:11 Werther 閱讀(1474) 評論(4)  編輯  收藏 所屬分類: 10.Java

          評論:
          # re: 淺談Java中的編碼理論[未登錄] 2009-05-06 22:28 | Dennis
          最後兩句是錯的
          str.getBytes("iso-8859-1") 時會出現永久性單向的 data lost, 不可能還原  回復  更多評論
            
          # re: 淺談Java中的編碼理論[未登錄] 2009-05-08 07:30 | shaofan
          "但是為什么輸出的順序(0xFE FF 6C 49 8B ED)和文件中的順序不一致(0xFF FE 49 6C ED 8B)?"

          樓主第二段的這句話中,后面的這段編碼應該是第一段提到的“UNICODE”的編碼,而非文件中的編碼,因為按樓主所說,文件中的編碼是UTF-8?

          另外,看了一遍還是沒有明白為什么它們的輸出的順序不一致,樓主能否解釋一下?

          謝謝。  回復  更多評論
            
          # re: 淺談Java中的編碼理論 2009-05-10 16:15 | luhua
          樓主能否在講一些java的編碼知識,謝謝了  回復  更多評論
            
          # re: 淺談Java中的編碼理論[未登錄] 2009-05-12 14:54 | xxx
          主站蜘蛛池模板: 铜陵市| 克拉玛依市| 德安县| 六枝特区| 康保县| 墨脱县| 渑池县| 时尚| 喀喇沁旗| 湖北省| 同仁县| 苗栗市| 章丘市| 淄博市| 莒南县| 余姚市| 沭阳县| 中牟县| 铅山县| 鹤庆县| 乳山市| 襄城县| 垣曲县| 石河子市| 尼勒克县| 乐山市| 伊金霍洛旗| 丹阳市| 五家渠市| 苍梧县| 通化市| 基隆市| 蒙阴县| 盐津县| 巴彦淖尔市| 崇阳县| 平塘县| 清原| 仙居县| 宜春市| 襄城县|