字符編碼之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處理多字節數的不同方式。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章