<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 0, comments - 77, trackbacks - 0, articles - 356
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Java 字符集編碼

    Posted on 2007-08-10 14:04 semovy 閱讀(3462) 評論(1)  編輯  收藏 所屬分類: JAVA基礎
    首先看清楚幾種常用的字符集編碼(java語言是采用unicode字符集編碼來表示字符與字符串的):

      ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼),是基于常用的英文字符的一套電腦編碼系統。我們知道英文中經常使用的字符、數字符號被計算機處理時都是以二進制碼的形式出現的。這種二進制碼的集合就是所謂的ASCII碼。每一個ASCII碼與一個8位(bit)二進制數對應。其最高位是0,相應的十進制數是0-127。如,數字“0”的編碼用十進制數表示就是48。另有128個擴展的ASCII碼,最高位都是1,由一些制表符和其它符號組成。ASCII是現今最通用的單字節編碼系統。

      GB2312:GB2312碼是中華人民共和國國家漢字信息交換用編碼,全稱《信息交換用漢字編碼字符集-基本集》。主要用于給每一個中文字符指定相應的數字,也就是進行編碼。一個中文字符用兩個字節的數字來表示,為了和ASCII碼有所區別,將中文字符每一個字節的最高位置都用1來表示。

      GBK:為了對更多的字符進行編碼,國家又發布了新的編碼系統GBK(GBK的K是“擴展”的漢語拼音第一個字母)。在新的編碼系統里,除了完全兼容GB2312 外,還對繁體中文、一些不常用的漢字和許多符號進行了編碼。

      ISO-8859-1:是西方國家所使用的字符編碼集,是一種單字節的字符集 ,而英文實際上只用了其中數字小于128的部分。

      Unicode:這是一種通用的字符集,對所有語言的文字進行了統一編碼,對每一個字符都用2個字節來表示,對于英文字符采取前面加“0”字節的策略實現等長兼容。如 “a” 的ASCII碼為0x61,UNICODE就為0x00,0x61。

      UTF-8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集標準的一個超集)。一個7位的ASCII碼值,對應的UTF碼是一個字節。如果字符是0x0000,或在0x0080與0x007f之間,對應的UTF碼是兩個字節,如果字符在0x0800與0xffff之間,對應的UTF碼是三個字節。

      我們運行java程序時,JVM有自己所支持的編碼種類,用以下代碼可以看到:

    Map m = Charset.availableCharsets();
       Set names
    = m.keySet();
       Iterator it
    = names.iterator();
      
    while (it.hasNext())
      
    {
        System.out.println(it.next());
       }


       然后可以通過以下代碼看到我們目前JVM所使用的編碼:

    Properties pps = System.getProperties();
       pps.list(System.out);

      具體來說什么是編碼,什么是解碼?
      在InputStreamReader JDK有這樣描述:It reads bytes and decodes them into characters using a specified charset.(用指定的字符集將字節數組解碼成字符串)。
      相反OutputStreamWriter 描述:Characters written to it are encoded into bytes using a specified charset.(用指定的字符集將字符串編碼成字節數組)。

      理解這個以后一切好辦了啦!

      我們的OS一般是GBK編碼的(凡是從磁盤上讀取文件可以看成是用OS的字符集編碼方式來對操作對象進行解碼處理--從標準輸入設備讀取數據的時候是依賴OS的字符集)。而我們將從磁盤上文件經過處理得到我們想要的字符串等其它對象的時候,這一過程是用JVM的默認的字符集編碼方式來處理的!由于不同的字符集編碼方式有著不同的原理(前面所述),這樣當編碼與解碼不一致的時候,自然而然就出現了可愛的亂碼。

      比如如下,將我們JVM字符集改成iso-8859-1這樣在就與我們的OS不同:
      當輸入中文時自然就輸出的是亂碼了。

    pps.put( " file.encoding " , " ISO-8859-1 " );
      
    int data;
      
    byte [] buf = new byte [ 100 ];
      
    int i = 0 ;
      
    while ((data = System.in.read()) != ' q ' )
      
    {
        buf[i]
    = ( byte )data;
        i
    ++ ;
       }

       String str
    = new String(buf, 0 ,i);
       System.out.println(str);

     
      這時我們可以用string的一個構造方法:
      String(byt[] bytes, String charsetName)
      Constructs a
    new String by decoding the specified array of bytes using the specified charset.(用指定的字符集對字節數組進行解碼)。
      其中用到了string 的getBytes方法:
      getBytes(String charsetName)
      Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.(用指定的字符集進行編碼,將結果存放到一字節數組里面)重新構造一個string:

    String strGBK = new String(str.getBytes( " ISO-8859-1 " ), " GBK " );

      這樣又可以重新得到我們想要的漢字了。

      我們這例子中是GBK(OS)來編碼的,然后采用iso-8859-1(JVM)來解碼得到一個新string(此string是亂碼),然后將此string用iso-8859-1重新編碼,并且用指定的GBK來解碼。得到一個新string(也就是strGBK),這個string就不再是亂碼了。

      但如果我們一開始就采用GBK解碼得到的字符串,然后用ISO-8859-1編碼,能否再解碼回去得到我們的中文字符呢?顯示不可以啦,因為用ISO-8859-1的編碼的時候采用是一種單字節的字符集來對其編碼,這樣就丟失了一個字節(對中文來說)!所以這樣是得不到中文字符的!


    評論

    # re: Java 字符集編碼  回復  更多評論   

    2010-02-24 18:01 by fdsafd
    文章寫的很好
    主站蜘蛛池模板: 18禁成人网站免费观看| 好吊色永久免费视频大全| 2020因为爱你带字幕免费观看全集 | 免费真实播放国产乱子伦| 亚洲日本VA午夜在线影院| 69成人免费视频无码专区| 亚洲三级高清免费| 成人人免费夜夜视频观看| 亚洲人成色在线观看| 国产v片免费播放| 看Aⅴ免费毛片手机播放| 夜色阁亚洲一区二区三区| 国产福利在线观看永久免费| 久久夜色精品国产亚洲av| a级毛片高清免费视频就| 久久精品国产精品亚洲艾| 最近2019中文字幕免费直播| 亚洲无限乱码一二三四区| 性xxxx视频播放免费| 日韩在线观看免费| 亚洲精品制服丝袜四区| 麻豆视频免费播放| 亚洲人成网站18禁止| 亚洲中文字幕丝袜制服一区| 182tv免费视频在线观看 | 亚洲熟妇无码一区二区三区导航 | 免费网站观看WWW在线观看| 亚洲五月激情综合图片区| 福利免费观看午夜体检区| 香蕉视频免费在线| 亚洲成色在线影院| 国外成人免费高清激情视频| 爱情岛论坛免费视频| 亚洲精品高清久久| 免费无码又爽又高潮视频| 成人妇女免费播放久久久| 亚洲综合亚洲国产尤物| 免费v片视频在线观看视频| 美女被cao网站免费看在线看| 亚洲香蕉久久一区二区三区四区| 一本久久综合亚洲鲁鲁五月天|