介紹
ASCII字元集在 0x00 到 0x7F 的範圍內定義字元。 還有其他一些字元集(主要是歐洲字元),它們在 0x00 到 0x7F 的範圍內定義與 ASCII 字元集相同的字元,還在 0x80 到 0xFF 的範圍內定義了擴展字元集。 因此,8 位的單位元組字元集(SBCS)足以表示 ASCII 字元集以及許多歐洲語言的字元集。 但是,一些非歐洲字元集(如日文漢字)包含許多單位元組代碼無法表示的字元,因此要求使用多位元組字元集 (MBCS) 編碼。
許多SBCS例程在
Microsoft運行庫中處理相應的多位元組位元組、字元和
字元串。 許多多位元組字元集將 ASCII 字元集定義為子集。 在許多多位元組字元集中,0x00 到 0x7F 範圍內的每個字元都與
ASCII字元集中具有相同值的字元相同。 例如,在ASCII和MBCS字元串中,單位元組NULL字元(“\0”)的值是 0x00 並且指示終止空字元。
多位元組字元集
多位元組字元集 (SBCS) 可能包括單位元組和雙位元組字元。 從而多位元組字元串可以包含單位元組和雙位元組字元混合。 兩位的多位元組字元有一個前導位元組和尾位元組。 在某個多位元組字元集內,前導位元組位於某個特定範圍內,尾位元組也一樣。 當這兩種範圍重疊時,可能需要計算上下文以確定某個給定的位元組是用作前導位元組還是尾位元組。
包括
單位元組字元包含拉丁文字母表,accentedcharacters及ASCII標準和DOS
作業系統定義的圖形字元。雙位元組字元被用來表示東亞及中東的語言。Unicode被用在COM及WindowsNT作業系統內部。
單位元組字元
你一定已經很熟悉單位元組字元。當你使用char時,你處理的是單位元組字元。雙位元組字元也用char類型來進行操作(這是我們將會看到的關於雙子節字元的很多奇怪的地方之一)。Unicode字元用wchar_t來表示。Unicode字元和字元串常量用前綴L來表示。
三種編碼模式
單子節字元集
(single-bytecharactersetorSBCS)。在這種編碼模式下,所有的字元都只用一個位元組表示。
ASCII是SBCS。一個位元組表示的0用來標誌SBCS字元串的結束。
多位元組字元集
(multi-bytecharactersetorMBCS)。一個MBCS編碼包含一些一個位元組長的字元,而另一些字元大於一個位元組的長度。用在Windows里的MBCS包含兩種字元類型,單位元組字元(single-bytecharacters)和雙位元組字元(double-bytecharacters)。由於
Windows里使用的多位元組字元絕大部分是兩個位元組長,所以MBCS常被用
DBCS(double-bytecharactersetor DBCS)代替。
在DBCS編碼模式中,一些特定的值被保留用來表明他們是雙位元組字元的一部分。例如,在Shift-JIS編碼中(一個常用的日文編碼模式),0x81-0x9f之間和0xe0-oxfc之間的值表示"這是一個雙位元組字元,下一個子節是這個字元的一部分。"這樣的值被稱作"leadingbytes",他們都大於0x7f。跟隨在一個leadingbyte子節後面的位元組被稱作"trailbyte"。在
DBCS中,trailbyte可以是任意非0值。像SBCS一樣,DBCS字元串的結束標誌也是一個單位元組表示的0。
Unicode
Unicode是一種所有的字元都使用兩個位元組編碼的編碼模式。Unicode字元有時也被稱作
寬字元(Wide Character),因為它比單子節字元寬(使用了更多的存儲空間)。注意,Unicode不能被看作MBCS。MBCS的獨特之處在於它的字元使用不同長度的位元組編碼。Unicode字元串使用兩個位元組表示的0作為它的結束標誌。
ASCII
名稱由來
ASCII(American Standard Code for Information Interchange,
美國信息互換標準編碼)是基於
羅馬字母表的一套電腦編碼系統。
特點
它主要用於顯示現代英語和其他
西歐語言。它是現今最通用的單
位元組編碼系統,並等同於國際標準ISO 646。
包含內容
可顯示字元:英文大小寫字元、阿拉伯數字和西文符號。
技術特徵
7位(bits)表示一個字元,共128字元,字元值從0到127,其中32到126是可列印字元。
擴展字元集
7位編碼的字元集只能支持128個字元,為了表示更多的
歐洲常用字元對ASCII進行了擴展,ASCII擴展字元集使用8位(bits)表示一個字元,共256字元。
ASCII擴展字元集:它是從ASCII字元集擴充出來的,擴充後的符號增加了表格符號、計算符號、希臘字母和特殊的拉丁符號。
判斷字元
對於字元串的處理,經常會遇到需要判斷字元是雙位元組還是單位元組(或者全形和半角)的情況,因為雙位元組字元和單位元組字元在螢幕上所占用的空間是不同的,通常情況下雙位元組字元占用的空間是單位元組字元的兩倍。
比如,一個字元串,可能包含中文英文數字和各種符號等等,將其輸出到螢幕上,需要根據長度判斷在哪裡進行截斷(
網頁編程中經常用到)。
<br>最常見的兩種方式。
<br>一種是通過String的getBytes().length來判斷,單個字元構成的字元串,其getBytes().length若大於1,則為雙位元組字元,否則為單位元組字元。不過需要注意的是,這種方式有一定缺陷,就是當使用英文作業系統來執行getBytes().length這句代碼的時候,單位元組雙位元組文本得到的結果是一樣的。這是因為不同的JAVA虛擬機對於字元的處理方式不同。所以,雖然這種方法很簡單,而且在大多數時候很有效,但是考慮到可能會有少部分使用英文作業系統的人,還是建議用下一種方法。
<br>另外一種是通過判斷某一位的字元是否大於0x80,如果大於則為雙位元組字元,否則為單位元組字元。