注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

chunwaihome 的博客

 
 
 

日志

 
 

認識中文字元碼  

2010-03-01 14:27:36|  分类: 語言 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  • 字元與編碼

(一)何謂字元

  字元(character)是人類語文的最基本單位,例如:中文字、英文字母、阿拉伯數字、標點符號等。而字元集(character set)則是指某種語文的全部字元(例如:英文的字元)或部份字元(例如:中文的字元)所形成的集合。

  字元也是電腦輸入、儲存、列印、顯示和處理文數字資訊的基本單位。任何電腦都必須具備內建的字元集,才能和人類溝通以及處理文數字資訊。電腦所使用的字元,可區分為圖形字元和控制字元兩類:

  • 圖形字元(graphic characters)指的是可以被顯示在螢光幕上或是被列印在報表紙上,用以構成文數字資訊或電腦語言的字元。就英文字元集而言,所包含的圖形字元為52個大小寫英文字母、10個阿拉伯數字和一些標點符號,總數還不到100個。但就中文字元集而言,所包含的圖形字元至少是成千上萬的中文字。

  • 控制字元(control characters)則代表特定的處理功能,可驅使電腦或通信設備執行特定程式,以進行特定處理或表現特定動作,例如:驅使螢光幕上的游標回到行首並換行、驅使印表機換行或跳頁、開始或終止資料的傳輸等。原則上,控制字元不具備可顯示或可列印的圖形。

 

(二)何謂編碼

  就微觀角度而言,電腦的硬體是由數以億計、極為微小(寬度甚至還不到十萬分之一公分)的電晶體開關所建構成的。這些開關只能有「開(on)」和「關(off)」兩種狀態,習慣上分別以“1”和“0”來表示,因此電腦內部可以看做是二進制數字的世界。換言之,在電腦系統內部,不論是用以組成程式的指令或任何形式的資料(包括:文字、圖形、影像、聲音、動畫等),全都是以二進制形式表現(驅使電晶體開關開或關)的電磁信號。

  由於硬體的限制,所有字元都必須先轉換成二進制數字才能被電腦所接受和處理。這種二進制數字又稱為二進碼(binary code)。二進碼的任何一個數位(digit),因其值必須是“1”或“0”,所以被稱做位元(bit,為“binary digit”)。針對特定的字元集,分別賦予每個字元一個對應的二進碼,稱為編碼。而對應於個別字元的二進碼則稱為字元碼(character code)。為了減少字元碼的書寫位數,習慣上將字元碼從二進制數字轉換成等值的十進制數字或十六進制數字。【註:十六進制每個數位的值為0至15,其中10到15以大寫字母A至F表示之;在本文中,於數字之後附加h表示十六進制。】

  字元編碼可大致分成下列四個步驟:

  1. 首先建立字元集(character set),也就是蒐集和整理所需要的圖形字元和控制字元。

  2. 將字元集的所有圖形字元加以排序。圖形字元的次序先後,決定字元碼的相對大小,並影響未來文數字資訊以字元碼大小排序的結果。通常是將圖形字元依據某些慣例和字元屬性加以排序,例如:英文字母先排大寫由“A”到“Z”、再排小寫由“a”到“z”,阿拉伯數字則由“0”排到“9”等。至於控制字元,則不一定需要排序。

  3. 依據字元集大小決定位元組長度。字元碼通常安排成固定長度(即位元數)。就長度為m的二進碼而言,共有2m個不同的位元值組合,每個位元值組合為一個碼位(code position),所有這些碼位的集合稱為編碼空間。假設二進碼的長度為3個位元,則其編碼空間為集合{000, 001, 010, 011, 100, 101, 110, 111},共23=8個 碼位。就特定字元集的編碼而言,編碼空間必須足以容納該字元集的所有字元。換言之,假設該字元集共有N個字元,且假設字元碼的長度為m,則m必須是等於或大於log(N)的最小整數,在此log的底數為2(亦即,2m≧N)。特定字元集編碼所需最小位數的二進碼稱為位元組(byte,原為bit的複數)。若某字元集共有90個字元,則針對此字元集,一個位元組必須至少是七個位元(因為26=64<90<27=128)。

  4. 編碼,也就是將已經排好順序的全部字元,依序分別賦予每個字元一個字元碼。

  請注意,上述的步驟2和步驟3只是原則而已。事實上,字元碼長度的選定和逐字元給碼,都必須遵守既定的標準或規範,下文中將進一步說明。

 

(三)位元組的演變

  早期電腦的主記憶體使用磁蕊記憶器,存取速度慢、價格昂貴而記憶容量小,因此設法減少原始程式和文數字資訊所佔用的記憶空間便成為當務之急。解決方法之一是︰將電腦所用的字元集簡化到只用26個大寫英文字母、10個阿拉伯數字,以及少數必要的標點符號和控制字元。如此一來,只需六個位元(共計64個碼位)就足以因應編碼所需。換言之,在早期的電腦系統裡,一個位元組為六個位元。眾所周知的程式語言FORTRAN IV只准許使用大寫英文字母、阿拉伯數字和很少的幾個標點符號來編寫程式,就是這時期所流傳下來的。雖然以六個位元為一個位元組幾乎是當時電腦廠商的共識,而且彼此的字元集內容也很相近,但字元的編碼卻並不一致。可以說,在1950~60年代,美國的電腦業界可說是萬「碼」奔騰、百家爭鳴。

  從1950年代中期起,隨著第一代商用電腦的日趨普及,美國圖書館界開始使用電腦來印製書目卡片,不久線上書目查詢系統也接著登場。為了降低編目作業的成本,避免重複編目,各圖書館開始提出共享書目的需求。但彼此使用不同的字元碼,卻妨礙了圖書館自動化業務的發展。1960年代初期,為解決書目資料交換的問題,美國國會圖書館(LC, Library of Congress)的Henriette Avram等人開始研擬機讀編目格式(machine-readable cataloging),同時James Agenboard等人也制訂了英文的字元集和交換碼,以做為美國圖書館界書目交換的共同標準。LC所編訂的字元集增加了小寫英文字母、收容了更多的標點符號和控制字元,因此六個位元變得不敷編碼所需。很自然的,一個位元組就由原先的六個位元增加為七個位元(共計128個碼位)。LC所制定的交換碼隨後成為美國的國家標準ASCII,並進而變成國際標準ISO/IEC 646

  ASCII原為交換碼,只是設計來做為各電腦之間,或是電腦與周邊設備之間,交換文數字資訊用的字元碼。但由於ASCII方便易用,加上半導體記憶體逐漸取代了磁蕊記憶體,使得電腦主記憶體的容量大增而價格急速下降,電腦廠商於是開始直接把ASCII當內碼,用以表達電腦內部的文數字資訊。雖然ASCII只有七個位元,但電腦廠商為了提升資料傳送時的可靠度,往往附加一個同位檢測用的位元,使得一個位元組雖然名義上是七個位元,但實質上卻是八個位元。1980年代以後,隨著微處理器技術的快速發展和工作站、個人電腦(PC)的日趨風行,因著微處理器是以8、16、32甚或64個位元為一個運算處理單位,使得一個位元組等於八個位元逐漸成為大家的共識。總而言之,以八個位元為一個位元組並非理當如此,而是有其歷史背景的。

  • UTF編碼

UTF-8就是以8位為單元對UCS進行編碼。從UCS-2到UTF-8的編碼方式如下:

 UCS-2編碼(16進制)   UTF-8 字節流(二進制)
 0000 - 007F  0xxxxxxx
 0080 - 07FF  110xxxxx 10xxxxxx
 0800 - FFFF  1110xxxx 10xxxxxx 10xxxxxx

UCS-2就是用兩個字節(Bytes)編碼,UCS-4就是用4個字節(Bytes)(實際上只用了31位,最高位必須為0)編碼。下面讓我們做一些簡單的數學遊戲:

UCS-2有2^16=65536個碼位,UCS-4有2^31=2147483648個碼位。

例如「漢」字的Unicode編碼是6C49。6C49在0800-FFFF之間,所以肯定要用3字節模板了:1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 110001 001001, 用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

 

UTF-16以16位為單元對UCS進行編碼。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼對應的16位無符號整數。對於不小於0x10000的UCS碼,定義了一個算法。不過由於實際使用的UCS2,或者UCS4的BMP必然小於0x10000,所以就目前而言,可以認為UTF-16和UCS-2基本相同。但UCS-2只是一個編碼方案,UTF-16卻要用於實際的傳輸,所以就不得不考慮字節序的問題。

  • big endian和little endian


big endian和little endian是CPU處理多字節數的不同方式。例如「漢」字的Unicode編碼是6C49。那麼寫到文件裡時,究竟是將6C寫在前面,還是將49寫在前面?如果將6C寫在前面,就是big endian。還是將49寫在前面,就是little endian。

「endian」這個詞出自《格列佛遊記》。小人國的內戰就源於吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開,由此曾發生過六次叛亂,其中一個皇帝送了命,另一個丟了王位。

我們一般將endian翻譯成「字節序」,將big endian和little endian稱作「大尾」和「小尾」。


  评论这张
 
阅读(711)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017