3 回答

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
ASCII定義了128個(gè)字符,它們映射到數(shù)字0–127。Unicode定義(少于2個(gè))21個(gè)字符,類似地,它們映射到數(shù)字0–2 21(盡管當(dāng)前并非所有數(shù)字都被分配,而某些數(shù)字是保留的)。
Unicode是ASCII的超集,數(shù)字0–127在ASCII中的含義與在Unicode中的含義相同。例如,數(shù)字65表示“拉丁大寫字母'A'”。
因?yàn)閁nicode字符通常不適合一個(gè)8位字節(jié),所以有許多種將Unicode字符存儲(chǔ)在字節(jié)序列中的方法,例如UTF-32和UTF-8。

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
首先了解為什么要?jiǎng)?chuàng)建ASCII和Unicode,這有助于我理解兩者之間的區(qū)別。
ASCII,起源
如其他答案所述,ASCII使用7位來表示字符。通過使用7位,我們最多可以有2 ^ 7(= 128)個(gè)不同的組合*。這意味著我們最多可以表示128個(gè)字符。
等一下7位 但是為什么不使用1個(gè)字節(jié)(8位)呢?
最后一位(第8位)用作奇偶校驗(yàn)位以避免錯(cuò)誤。這與多年前有關(guān)。
大多數(shù)ASCII字符是字母的可打印字符,例如abc,ABC,123,?&!等。其他字符是控制字符,例如回車,換行,制表符等。
參見下面幾個(gè)ASCII字符的二進(jìn)制表示形式:
0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)
請(qǐng)參閱此處的完整ASCII表。
ASCII僅用于英語。
什么?為什么只用英語?有那么多語言!
因?yàn)楫?dāng)時(shí)計(jì)算機(jī)行業(yè)的中心在美國(guó)。結(jié)果,他們不需要支持重音符號(hào)或其他標(biāo)記,例如á,ü,?,?等(又稱變音符號(hào))。
ASCII擴(kuò)展
一些聰明的人開始使用第8位(用于奇偶校驗(yàn)的位)來編碼更多字符以支持其語言(例如,以法語支持“é”)。只需使用一個(gè)額外的位,就可以將原始ASCII表的大小增加一倍,以映射最多256個(gè)字符(2 ^ 8 = 256個(gè)字符)。而不是像以前一樣2 ^ 7(128)。
10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)
該“ ASCII擴(kuò)展到8位而不是以前的7位”的名稱可以簡(jiǎn)稱為“擴(kuò)展ASCII”或“ 8位ASCII”。
正如@Tom在下面的評(píng)論中指出的那樣,沒有諸如“ extended ASCII ”之類的東西,但這是引用此8位技巧的簡(jiǎn)便方法。8位ASCII表有很多變體,例如ISO 8859-1,也稱為ISO Latin-1。
Unicode,崛起
ASCII擴(kuò)展解決了基于拉丁字母的語言的問題……其他人需要完全不同的字母怎么辦?希臘語?俄語?中國(guó)人喜歡嗎?
我們將需要一個(gè)全新的字符集……這就是Unicode背后的原理。Unicode并不包含每種語言的每個(gè)字符,但它確實(shí)包含大量的字符(請(qǐng)參閱此表)。
您不能將文本以“ Unicode”保存到硬盤驅(qū)動(dòng)器。Unicode是文本的抽象表示。您需要“編碼”此抽象表示。這就是編碼發(fā)揮作用的地方。
編碼:UTF-8與UTF-16與UTF-32
這個(gè)答案在解釋基本知識(shí)方面做得很好:
UTF-8和UTF-16是可變長(zhǎng)度編碼。
在UTF-8中,一個(gè)字符可能至少占用8位。
在UTF-16中,字符長(zhǎng)度以16位開始。
UTF-32是32位的固定長(zhǎng)度編碼。
UTF-8將ASCII設(shè)置用于前128個(gè)字符。這很方便,因?yàn)檫@意味著ASCII文本在UTF-8中也有效。
助記符:
UTF- 8:最少8位。
UTF- 16:最少16位。
UTF- 32:最小和最大32位。
注意:
為什么是2 ^ 7?
這對(duì)于某些人來說是顯而易見的,但以防萬一。我們有七個(gè)可用0或1(二進(jìn)制代碼)填充的插槽。每個(gè)可以有兩個(gè)組合。如果我們有七個(gè)點(diǎn),則我們有2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128個(gè)組合??梢詫⑵湎胂鬄榫哂衅邆€(gè)輪子的密碼鎖,每個(gè)輪子只有兩個(gè)數(shù)字。
資料來源:Wikipedia,這篇很棒的博客文章和Mocki,我最初在其中發(fā)布了此摘要。

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
ASCII具有128個(gè)代碼點(diǎn),從0到127。它可以容納在單個(gè)8位字節(jié)中,值128到255傾向于用于其他字符。選擇不兼容會(huì)導(dǎo)致代碼頁災(zāi)難。假定或猜測(cè)另一代碼頁的程序無法正確讀取在一個(gè)代碼頁中編碼的文本。
Unicode來解決這一災(zāi)難。第1版以65536個(gè)代碼點(diǎn)開始,通常以16位編碼。后來在版本2中擴(kuò)展到110萬個(gè)代碼點(diǎn)。當(dāng)前版本是6.3,使用了110187個(gè)可用代碼點(diǎn)中的110,187個(gè)。這不再適合16位。
v2出現(xiàn)時(shí),通常采用16位編碼,例如Microsoft和Apple操作系統(tǒng)使用的。還有像Java這樣的語言運(yùn)行時(shí)。v2規(guī)范提出了一種將110萬個(gè)代碼點(diǎn)映射為16位的方法。一種稱為UTF-16的編碼,一種可變長(zhǎng)度編碼,其中一個(gè)代碼點(diǎn)可以占用2或4個(gè)字節(jié)。原始的v1代碼點(diǎn)占用2個(gè)字節(jié),添加的代碼點(diǎn)占用4個(gè)字節(jié)。
在* nix操作系統(tǒng)和工具中使用的另一種非常常見的可變長(zhǎng)度編碼是UTF-8,一個(gè)代碼點(diǎn)可以占用1到4個(gè)字節(jié),原始ASCII碼需要1個(gè)字節(jié),其余的則更多。唯一的可變長(zhǎng)度編碼是UTF-32,一個(gè)代碼點(diǎn)需要4個(gè)字節(jié)。不經(jīng)常使用,因?yàn)樗芾速M(fèi)。還有其他一些字符,例如UTF-1和UTF-7,被廣泛忽略。
UTF-16 / 32編碼的問題是字節(jié)的順序?qū)⑷Q于創(chuàng)建文本流的計(jì)算機(jī)的字節(jié)順序。因此,將UTF-16BE,UTF-16LE,UTF-32BE和UTF-32LE添加到混合中。
擁有這些不同的編碼選擇會(huì)在某種程度上帶給代碼頁災(zāi)難,以及程序員之間關(guān)于UTF選擇“最佳”的激烈爭(zhēng)論。它們與操作系統(tǒng)默認(rèn)值的關(guān)聯(lián)幾乎可以劃清界限。一種對(duì)策是定義BOM,字節(jié)順序標(biāo)記,在文本流開頭的特殊代碼點(diǎn)(U + FEFF,零寬度空間),指示如何對(duì)其余流進(jìn)行編碼。它既指示UTF編碼又指示字節(jié)序,并且對(duì)于文本呈現(xiàn)引擎而言是中立的。不幸的是,它是可選的,許多程序員聲稱有權(quán)忽略它,因此事故仍然很常見。
- 3 回答
- 0 關(guān)注
- 1088 瀏覽
添加回答
舉報(bào)