資源描述:
《java亂碼問題分析及解決22》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、java亂碼問題分析及解決計算機(jī)中,只有二進(jìn)制的數(shù)據(jù),不管數(shù)據(jù)是在內(nèi)存中,還是在外部存儲設(shè)備上。對于我們所看到的字符,也是以二進(jìn)制數(shù)據(jù)的形式存在的。不同字符對應(yīng)二進(jìn)制數(shù)的規(guī)則,就是字符的編碼。字符編碼的集合稱為字符集。下面我們來總結(jié)下常用字符集1.ASCIIASCII(AmericanStandardCodeforInformationInterchange,美國信息互換標(biāo)準(zhǔn)代碼),是基于常用的英文字符的一套電腦編碼系統(tǒng)。每一個ASCII碼與一個8位(bit)二進(jìn)制數(shù)對應(yīng)。其最高位是0,相應(yīng)的十進(jìn)制數(shù)是0~127
2、。例如,數(shù)字字符“0”的編碼用十進(jìn)制數(shù)表示就是48。另有128個擴(kuò)展的ASCII碼,最高位都是1,由一些圖形和畫線符號組成。ASCII是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)。ASCII用一個字節(jié)來表示字符,最多能夠表示256種字符。隨著計算機(jī)的普及,許多國家都將本地的語言符號引入到計算機(jī)中,擴(kuò)展了計算機(jī)中字符的范圍,于是就出現(xiàn)了各種不同的字符集。ASCII碼表請看附錄一。2.ISO8859-1因?yàn)锳SCII碼中缺少£、ü和許多書寫其他語言所需的字符,為此,可以通過指定128以后的字符來擴(kuò)展ASCII碼。國際標(biāo)準(zhǔn)組織(ISO
3、)定義了幾個不同的字符集,它們是在ASCII碼基礎(chǔ)上增加了其他語言和地區(qū)需要的字符。其中最常用的是ISO8859-1,通常叫做Latin-1。Latin-1包括了書寫所有西方歐洲語言不可缺少的附加字符,其中0~127的字符與ASCII碼相同。ISO8859另外定義了14個適用于不同文字的字符集(8859-2到8859-15)。這些字符集共享0~127的ASCII碼,只是每個字符集都包含了128~255的其他字符。3.GB2312和GBKGB2312是中華人民共和國國家標(biāo)準(zhǔn)漢字信息交換用編碼,全稱《信息交換用漢字編
4、碼字符集-基本集》,標(biāo)準(zhǔn)號為GB2312-80,是一個由中華人民共和國國家標(biāo)準(zhǔn)總局發(fā)布的關(guān)于簡化漢字的編碼,通行于中國大陸和新加坡,簡稱國標(biāo)碼。因?yàn)橹形淖址麛?shù)量較多,所以采用兩個字節(jié)來表示一個字符,分別稱為高位和低位。為了和ASCII碼有所區(qū)別,中文字符的每一個字節(jié)的最高位都用1來表示。GB2312字符集是幾乎所有的中文系統(tǒng)和國際化的軟件都支持的中文字符集,也是最基本的中文字符集。它包含了大部分常用的一、二級漢字和9區(qū)的符號,其編碼范圍是高位0xa1-0xfe,低位也是0xa1-0xfe,漢字從0xb0a1開始,
5、結(jié)束于0xf7fe。為了對更多的字符和符號進(jìn)行編碼,由前電子部科技質(zhì)量司和國家技術(shù)監(jiān)督局標(biāo)準(zhǔn)化司于1995年12月頒布了GBK(K是“擴(kuò)展”的漢語拼音第一個字母)編碼規(guī)范,在新的編碼系統(tǒng)里,除了完全兼容GB2312外,還對繁體中文、一些不常用的漢字和許多符號進(jìn)行了編碼。它也是現(xiàn)階段Windows和其他一些中文操作系統(tǒng)的默認(rèn)字符集,但并不是所有的國際化軟件都支持該字符集。不過要注意的是GBK不是國家標(biāo)準(zhǔn),它只是規(guī)范。GBK字符集包含了20902個漢字,其編碼范圍是0x8140-0xfefe。每個國家(或區(qū)域)都規(guī)定
6、了計算機(jī)信息交換用的字符編碼集,這就造成了交流上的困難。想像一下,你發(fā)送一封中文郵件給一位遠(yuǎn)在西班牙的朋友,當(dāng)郵件通過網(wǎng)絡(luò)發(fā)送出去的時候,你所書寫的中文字符會按照本地的字符集GBK轉(zhuǎn)換為二進(jìn)制編碼數(shù)據(jù),然后發(fā)送出去。當(dāng)你的朋友接收到郵件(二進(jìn)制數(shù)據(jù))后,查看信件時,會按照他所用系統(tǒng)的字符集,將二進(jìn)制編碼數(shù)據(jù)解碼為字符,然而由于兩種字符集之間編碼的規(guī)則不同,導(dǎo)致轉(zhuǎn)換出現(xiàn)亂碼。這是因?yàn)椋诓煌淖址g,同樣的數(shù)字可能對應(yīng)了不同的符號,也可能在另一種字符集中,該數(shù)字沒有對應(yīng)符號。為了解決上述問題,統(tǒng)一全世界的字符編
7、碼,由Unicode協(xié)會制定并發(fā)布了Unicode編碼。1.UNICODEUnicode(統(tǒng)一的字符編碼標(biāo)準(zhǔn)集)使用0~65535的雙字節(jié)無符號數(shù)對每一個字符進(jìn)行編碼。它不僅包含來自英語和其他西歐國家字母表中的常見字母和符號,也包含來自古斯拉夫語、希臘語、希伯來語、阿拉伯語和梵語的字母表。另外還包含漢語和日語的象形漢字和韓國的Hangul音節(jié)表。目前已經(jīng)定義了40000多個不同的Unicode字符,剩余25000個空缺留給將來擴(kuò)展使用。其中大約20000個字符用于漢字,另外11000左右的字符用于韓語音節(jié)。Uni
8、code中0~255的字符與ISO8859-1中的一致。Unicode編碼對于英文字符采取前面加“0”字節(jié)的策略實(shí)現(xiàn)等長兼容。如“a”的ASCII碼為0x61,Unicode碼就為0x00,0x61。2.UTF-8使用Unicode編碼,一個英文字符要占用兩個字節(jié),在Internet上,大多數(shù)的信息都是用英文來表示的,如果都采用Unicode編碼,將會使數(shù)據(jù)量增加一倍。為