1. 程式人生 > >字元編碼之Ascll編碼,ANSI編碼,Unicode編碼,UTF-8編碼 ,BOM

字元編碼之Ascll編碼,ANSI編碼,Unicode編碼,UTF-8編碼 ,BOM

從大一上C語言就開始認識了Ascll編碼,ascll碼也算是我們最早所接觸的編碼

【1】Ascll碼

 Ascll碼由三部分組成:

          第一部分從00H到1FH共32個,一般用來通訊或作為開工至之用,有的可以顯示在螢幕上,有的則無法再螢幕上顯示。

          第二部分從20H到7FH共96個,除了32H的空格之外,其餘的95個字元用來表示阿拉伯數字,英文字母大小寫和底線,括號等其他符號。這裡需要記一下日常經常用到的:0是048號,A是065號,a是097號。

          第三部分從80H到0FFH共128個字元,一般稱為擴充字元,zhe128個字元是由IBM指定的,並非標準的ASCLL碼,用來表示框線,音標和其它歐洲非英語系的字元。

接下來附上百度找的一張Ascll碼錶:

【2】ANSI

首先要說的是在不同的系統下ANSI表示不同的編碼值。為什麼呢?

            因為不同的國家和地區對ANCI編碼指定了不同的標準,由此產生了比如GB2312,GBK,Big5,shift_jis等不同的編碼標準,稱這些使用1至4個位元組來代表一個字元的各種字元延伸的編碼方式為ANSI編碼。而這些ANSI碼之間是互不相容的,因此會導致不同語言的文字中會出現亂碼。

            ANSI編碼用的是0x00~0x7f範圍的1個位元組來表示一個英文字元,也就是說ANSI碼僅在前126個與ASCLL碼相同(所以ANSI可以理解為是Ascll碼的一種擴充套件

),其他超出此範圍的0x80~0xFFFF用多個位元組來表示一個字元,用來表示其他語言的其他字元(要表示不同國家那麼多語言,這些編碼肯定是不足夠的,因此只能表示一部分).

            如果你要解碼一份檔案(如果是ANSI編碼檔案的話),不僅要知道它是ANSI編碼,還要知道它是哪個國家的,才能解碼。

            記事本預設以ANCI編碼儲存文字文件。(記事本有四種編碼方式:UTF-8,ANSI,Unicode,Unicode big endian)

【3】Unicode(萬國碼)

         由此,為了解決不同語言的編碼亂碼問題,出現了Unicode(UCS).

           所以說Unicode是在ANSI之後出現的由國際組織設計,可以容納全世界所有的語音文字的編碼方

案。它為每種語言中的每個字元設定了統一併且唯一的二進位制編碼,來實現不同語言,不同國家直接對字元的轉換和處理。

             Unicode通常用兩個位元組來表示一個字元,(生僻字可能會用四個位元組)原來ANSI裡用一個位元組來表示英文編碼在Unicode裡變成了用兩個位元組編碼。

             Unicode編碼的缺點就是浪費空間,比如在ANSI前英文字符集裡只用一個位元組就可以表示,可是在Unicode編碼中就需要用兩個位元組,造成了空間浪費(高位元組位補0)

【4】UTF-8

       那Unicode編碼也有缺點,這可如何是好?此時UTF-8編碼就產生啦!!!

 UTF-8編碼最大的特點就是可變長編碼:它根據不同的字元來改變位元組長度,比如ascll碼範圍時用一個位元組表示(保留了ascll碼的編碼方式),Unicode中中文字元佔兩個位元組,而在UTF-8中佔3個位元組,而且Unicode和UTF-8之間需要通過一系列的演算法和規則來進行轉換並非直接轉換。

         計算機記憶體中統一使用Unicode編碼

         資料傳輸的時候使用的是UTF-8編碼方式

         檔案儲存的時候由UTF-8轉成Unicode編碼放入記憶體,讀取時有Unicode再轉成UTF-8

         網頁使用的統一編碼UTF-8編碼

在這個時候小北同學就很好奇了,那如何解析一箇中文文字檔案嘞?中文那麼多編碼格式,計算機如何判斷它用的是哪種編碼方式寫的嘞?

這個時候我發現了一個好東東!!!哈哈哈哈哈哈哈哈嗝

          BOM,BOM就是byte order Mark ,一般呢為了方便解析中文檔案,它的檔案頭都會加一個編碼格式標識就是BOM,不同的編碼方式對應的BOM是不同的。

比如:UTF-8是0xEF BB BF

UTF-16(BE):0xFE FF

UTF-16(LE):0xFF FE

上面的BE和LE表示它儲存的時候用的是大端或者小端模式,指的是CPU處理多位元組數的不同方式。