摘要:所以中國人自己創造了一種字符編碼,每個漢字和符號用兩個字節來表示。第一個字節稱為高位字節,第二個字節稱為低位字節。而目前為止我們使用最廣泛的中文編碼還是。
ASCII網站開發中經常會被亂碼問題困擾。知道文件編碼錯誤會導致亂碼,但對其中的原理卻知之甚少。偶然從某篇文章了解了Unicode,發現從這條線出發也牽引出了一系列缺失的知識點。通過研讀文章,基本了解了一些以前不明白的問題,所以整理了幾篇,從幾個角度介紹下Unicode, 并聊聊一些相關的問題。
上世紀60年代,美國人采用了一種編碼來表示英語以及各種符號,該編碼方式只有一個字節,能表示256(2^8)個字符。至今為止才定義了128個字符。包括33個控制字符和95個可顯示字符,這些可顯示字符涵蓋了大小寫英文字母和一些符號,這就是大名鼎鼎的ASCII編碼。
GB 2312然而隨著計算機的發展,各個國家的語言符號多不勝數,在中國光中文字符就有7000多個,還不包括繁體中文,ASCII顯然無法滿足這么多字符編碼需求。所以中國人自己創造了一種字符編碼,每個漢字和符號用兩個字節來表示。第一個字節稱為"高位字節",第二個字節稱為"低位字節"。高位字節使用了0xA1 - 0xF7, "低位字節"使用了0xA1 - 0xFE。同時該編碼方式兼容了ASCII的編碼,對于小于127的字符即0x00 - 0x7F的字符予以保留。這種編碼方式就是中文編碼GB 2312。
GBK然而GB 2312能表示的文字也比較有限,對于一些人名,古漢語和繁體字也無能為力。所以我們改進了GB 2312的編碼方式,擴展了GB 2312 中不使用的字節,使其同時包括了GB2312的所有內容,又新增了近20000個新的漢字,包括繁體字。該編碼就是我們熟悉的GBK。后來由于又加了少數名族的文字,又推出了GB18030,用于取代GBK。而目前為止我們使用最廣泛的中文編碼還是GBK。
Unicode再后來,由于不同的國家地區之間都使用不同的編碼,導致計算機文件的讀取都需要安裝不同的解碼軟件。經常照成文件讀取亂碼。于是有一些組織決定制定出一個方案,通過統一的編碼解決這個難題。于是其中一個團隊發明了UCS編碼,還有另一個團隊發明了Unicode。后來兩者達成一致,只發布一套字符集,那就是Unicode 。而UCS的碼點將與Unicode保持一致。
Unicode最初規定用16位的編碼空間,這16位編碼空間稱為統一碼。這樣理論上一共最多有2^16(65536)個字符。基本滿足各種語言的使用。實際上當前版本的統一碼并未完全使用這16位編碼,而是保留了大量空間以作為特殊使用或將來擴展。
目前的Unicode字符分為17組編排,每組稱為一個平面(Plane),而每平面擁有65536(即2^16)個碼點。上述16位統一碼字符稱為基本多文種平面(BMP),寫成16進制就是從U+0000到U+FFFF。 剩下還有16個輔助平面(SMP),碼點范圍從U+010000一直到U+10FFFF。這17個平面結合起來至少需要占據21位的空間(2^16 x 2^5),也就是差不多3個字節(24位),而輔助平面實際上是用4個字節表示,方便以后向后擴展。
上面講到的幾種編碼都是編碼方式,規定了從碼點到字符的映射關系,例如 Unicode中U+0061 對應的就是小寫字母 "a", 我們可以在瀏覽器控制臺中輸入碼點查找對應的字符:
UTF
Unicode的實現方式不同于編碼方式。一個字符的Unicode編碼是確定的。但是在實際傳輸過程中,由于不同系統平臺的設計不一定一致,以及出于節省空間的目的,對Unicode編碼的實現方式有所不同。Unicode的實現方式稱為Unicode轉換格式(Unicode Transformation Format,簡稱為UTF)。
網頁開發中比較熟悉和常用的編碼實現是UTF-8。那么這種實現方式有什么優勢呢?UTF-8是一種變長的編碼方法。字符長度從1字節到4字節不等。最前面的128個字符,只使用1個字節表示,延續了ASCII的用法。其他分段的字節數如下:
計算機在讀取數據的時候都是從高位到地位或從地位到高位。當計算機讀到一個3字節字符時,怎么判斷是輸出1位字符,還是繼續讀取接下來的2位并合并為一個字符呢?這就要涉及到UTF-8的具體實現了。
UTF-8是這樣做的:
單字節的字符,字節的第一位設為0,對于英語文本,UTF-8碼只占用一個字節,和ASCII碼完全相同;
n個字節的字符(n>1),第一個字節的前n位設為1,第n+1位設為0,后面字節的前兩位都設為10,這n個字節的其余空位填充該字符unicode碼,高位用0補足。
這樣就形成了如下的UTF-8標記位:
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
當讀到第一位時,發現是0開頭,就讀一個字節。發現是110,就讀兩個字節,發現是1110就讀三個字節,以此類推,再根據Unicode規則找到對應的符號輸出。這種變長的編碼方式,能根據字符采用不同位數的碼點,能夠有效減少文件的體積。
如果采用Unicode的編碼方式直接作為實現方法。那么每個字符都是定長的碼點,對于只需要一個字節的字符,需要在前面補0. 這樣就照成了空間的浪費,文件就會變大。
UTF編碼除了UTF-8,還有UTF-16:最小的碼點為2個字節;UTF-32:每個碼點固定用4個字節表示。由于UTF-32傳輸場進下會照成文件空間浪費,HTML5標準規定,網頁不得編碼成UTF-32。
關于Unicode的介紹就到這。UCS的相關知識,將在下一章結合JavaScript一起講到。
參考文章:
https://zh.wikipedia.org/wiki
http://www.ruanyifeng.com/blo...
https://www.zhihu.com/questio...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86750.html
摘要:受到這個的影響,中的字符操作函數某些情況無法返回正確的結果。的碼點,還有另外一種表示方法,稱為進制轉義序列。這與我們的認知有點不同,我們通常認為一個表情符號也是一個字符,長度為。而如果通過來判斷字符串長度顯然是不夠準確的。 大家對上一篇文章中提到的UCS編碼可能比較陌生。殊不知這就是JavaScript采用的編碼方法。 既然Unicode已經統一了天下,為什么JavaScript不采用...
摘要:所以,哪怕是初學者,都要了解并能夠解決字符編碼問題。在這個世界上,有好多不同的字符編碼。目前最新的版本為,已收入超過十萬個字符第十萬個字符在年獲采納。涵蓋的數據除了視覺上的字形編碼方法標準的字符編碼外,還包含了字符特性,如大小寫字母。 字符編碼,在編程中,是一個讓學習者比較郁悶的東西,比如一個str,如果都是英文,好說多了。但恰恰不是如此,中文是我們不得不用的。所以,哪怕是初學者,都要...
摘要:在各種論壇上,經常會看到一些奇怪的字符,它們的內容會超出顯示范圍,舉個例子常見的還有一些有泰文字符組成的。第一種是對字符串文字區域設置最大高度,超出的部分自動隱藏。將附加字符進行過濾,這種方法在某種程度上會誤殺一些需要正常顯示的附加符號。 在各種論壇上,經常會看到一些奇怪的字符,它們的內容會超出顯示范圍, 舉個例子: Z??????????????????A????????L?????...
摘要:正則表達式巧用匹配特殊字符作者原文章首先聲明,本文所有的代碼都是在下面運行,需要修改之后才能運行,但是本文沒有涉及到太多的新特性,而且由于對修飾符不支持,最后的實現也基本是用的知識寫的代碼。 正則表達式巧用 Unicode 匹配特殊字符 作者 @zwhu 原文章 @github 首先聲明,本文所有的代碼都是在 ES6 下面運行,ES5需要修改之后才能運行,但是本文沒有涉及到太多的ES6...
摘要:起初這個委員沒有認識到我國博大精深的語言文化,認為用已經足以表示世界上的任何一個字符。所以是一種編碼標準,目標將世界上的每一個字符用統一二進制數字來表示。編碼期間有一段區間碼是保留的,保留的范圍是這段字符碼不表示任何字符。 ---對unicode編碼和java代碼單元問題研究總結 前言:最近在《java編程思想》一書中看到了代碼點與代碼單元的概念,當中介紹了java采用U...
閱讀 3948·2021-09-24 10:24
閱讀 1386·2021-09-22 16:01
閱讀 2713·2021-09-06 15:02
閱讀 1013·2019-08-30 13:01
閱讀 1002·2019-08-30 10:52
閱讀 632·2019-08-29 16:36
閱讀 2231·2019-08-29 12:51
閱讀 2333·2019-08-28 18:29