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

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

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

    JAVA

    人生若只如初見,何事秋風(fēng)悲畫扇。

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      50 隨筆 :: 25 文章 :: 157 評(píng)論 :: 0 Trackbacks

      看了孫鑫老師的相關(guān)講解后,總結(jié)一下。

      首先看清楚幾種常用的字符集編碼(java語(yǔ)言是采用unicode字符集編碼來(lái)表示字符與字符串的):

      ASCII(American Standard Code for Information Interchange,美國(guó)信息互換標(biāo)準(zhǔn)代碼),是基于常用的英文字符的一套電腦編碼系統(tǒng)。我們知道英文中經(jīng)常使用的字符、數(shù)字符號(hào)被計(jì)算機(jī)處理時(shí)都是以二進(jìn)制碼的形式出現(xiàn)的。這種二進(jìn)制碼的集合就是所謂的ASCII碼。每一個(gè)ASCII碼與一個(gè)8位(bit)二進(jìn)制數(shù)對(duì)應(yīng)。其最高位是0,相應(yīng)的十進(jìn)制數(shù)是0-127。如,數(shù)字“0”的編碼用十進(jìn)制數(shù)表示就是48。另有128個(gè)擴(kuò)展的ASCII碼,最高位都是1,由一些制表符和其它符號(hào)組成。ASCII是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)。

      GB2312:GB2312碼是中華人民共和國(guó)國(guó)家漢字信息交換用編碼,全稱《信息交換用漢字編碼字符集-基本集》。主要用于給每一個(gè)中文字符指定相應(yīng)的數(shù)字,也就是進(jìn)行編碼。一個(gè)中文字符用兩個(gè)字節(jié)的數(shù)字來(lái)表示,為了和ASCII碼有所區(qū)別,將中文字符每一個(gè)字節(jié)的最高位置都用1來(lái)表示。

      GBK:為了對(duì)更多的字符進(jìn)行編碼,國(guó)家又發(fā)布了新的編碼系統(tǒng)GBK(GBK的K是“擴(kuò)展”的漢語(yǔ)拼音第一個(gè)字母)。在新的編碼系統(tǒng)里,除了完全兼容GB2312 外,還對(duì)繁體中文、一些不常用的漢字和許多符號(hào)進(jìn)行了編碼。

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

      Unicode:這是一種通用的字符集,對(duì)所有語(yǔ)言的文字進(jìn)行了統(tǒng)一編碼,對(duì)每一個(gè)字符都用2個(gè)字節(jié)來(lái)表示,對(duì)于英文字符采取前面加“0”字節(jié)的策略實(shí)現(xiàn)等長(zhǎng)兼容。如 “a” 的ASCII碼為0x61,UNICODE就為0x00,0x61。

      UTF-8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集標(biāo)準(zhǔn)的一個(gè)超集)。一個(gè)7位的ASCII碼值,對(duì)應(yīng)的UTF碼是一個(gè)字節(jié)。如果字符是0x0000,或在0x0080與0x007f之間,對(duì)應(yīng)的UTF碼是兩個(gè)字節(jié),如果字符在0x0800與0xffff之間,對(duì)應(yīng)的UTF碼是三個(gè)字節(jié)。

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

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


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

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

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

      理解這個(gè)以后一切好辦了啦!

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

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

    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);

     
      這時(shí)我們可以用string的一個(gè)構(gòu)造方法:
      String(byt[]?bytes,?String?charsetName)?
      Constructs?a?
    new?String?by?decoding?the?specified?array?of?bytes?using?the?specified?charset.(用指定的字符集對(duì)字節(jié)數(shù)組進(jìn)行解碼)。
      其中用到了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.(用指定的字符集進(jìn)行編碼,將結(jié)果存放到一字節(jié)數(shù)組里面)重新構(gòu)造一個(gè)string:

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

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

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

      但如果我們一開始就采用GBK解碼得到的字符串,然后用ISO-8859-1編碼,能否再解碼回去得到我們的中文字符呢?顯示不可以啦,因?yàn)橛肐SO-8859-1的編碼的時(shí)候采用是一種單字節(jié)的字符集來(lái)對(duì)其編碼,這樣就丟失了一個(gè)字節(jié)(對(duì)中文來(lái)說(shuō))!所以這樣是得不到中文字符的!

    posted on 2006-06-29 08:42 Jkallen 閱讀(2380) 評(píng)論(4)  編輯  收藏 所屬分類: JEE學(xué)習(xí)

    評(píng)論

    # re: 字符集的編(解)碼的總結(jié) 2006-06-29 09:17 hhh
    簡(jiǎn)單一句話來(lái)說(shuō),不同編碼解碼就是對(duì)同一串二進(jìn)制數(shù)據(jù)的不同詮釋。  回復(fù)  更多評(píng)論
      

    # re: 字符集的編(解)碼的總結(jié) 2006-07-02 09:11 藍(lán)天
    有道理哦。  回復(fù)  更多評(píng)論
      

    # re: 字符集的編(解)碼的總結(jié)[未登錄](méi) 2008-07-03 06:58 lily
    很好  回復(fù)  更多評(píng)論
      

    # re: 字符集的編(解)碼的總結(jié) 2009-11-26 10:00 愛美女
    可以用這個(gè)轉(zhuǎn)換工具convertz802,一開始也是搞了半天編碼  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲小说区图片区另类春色| 一级视频在线免费观看| 亚洲国产精品无码专区| 妞干网免费观看视频| 国产精成人品日日拍夜夜免费 | 9i9精品国产免费久久| 一本色道久久88亚洲精品综合| 国产亚洲婷婷香蕉久久精品| 国产在线19禁免费观看国产 | 久久亚洲AV无码精品色午夜麻豆 | 亚洲AV无码国产剧情| 亚洲色图视频在线观看| 亚洲综合网站色欲色欲| 一区二区三区亚洲视频| 亚洲国产精品嫩草影院在线观看| 国产免费一区二区三区VR| 成人免费一区二区无码视频| 性色午夜视频免费男人的天堂 | 国产成人麻豆亚洲综合无码精品| 国产福利免费在线观看| 一二三四影视在线看片免费| 99久久久国产精品免费牛牛| 美女视频黄a视频全免费网站色窝 美女被cao网站免费看在线看 | 亚洲国产精品自在线一区二区| 亚洲黄黄黄网站在线观看| 国产福利免费观看| 日本二区免费一片黄2019| 午夜两性色视频免费网站| 日韩吃奶摸下AA片免费观看| aⅴ免费在线观看| 亚洲一级毛片免费观看| 无码成A毛片免费| 性色午夜视频免费男人的天堂| 日韩电影免费在线观看中文字幕| 国产精品免费看久久久香蕉 | 日本免费一区尤物| 永久免费AV无码网站在线观看| 女人18毛片水真多免费播放| 白白国产永久免费视频| 国产乱色精品成人免费视频| 亚洲国产人成中文幕一级二级|