首頁 後端開發 php教程 字元集編碼ASCII,Unicode和UTF-8你知道多少?字符集編碼匯總(收藏)

字元集編碼ASCII,Unicode和UTF-8你知道多少?字符集編碼匯總(收藏)

Aug 31, 2018 am 11:22 AM
ascii unicode utf-8

對字元集編碼ASCII,Unicode和UTF-8你知道多少?這篇文章將讓你徹底了解字符集編碼。本篇文章介紹了ASCII,Unicode 和 UTF-8編碼的問題和轉換還有實例分析。開始閱讀文章吧

一、ASCII 碼

#我們知道,電腦內部,所有資訊最終都是二進位值。每一個二進位位元(bit)有0和1兩種狀態,因此八個二進位位元就可以組合出256種狀態,稱為一個位元組(byte)。也就是說,一個位元組總共可以用來表示256種不同的狀態,每一個狀態對應一個符號,就是256個符號,從00000000到11111111。

上個世紀60年代,美國制定了一套字元編碼,對英文字元與二進位位元之間的關係,做了統一規定。這稱為 ASCII 碼,一直沿用至今。

ASCII 碼一共規定了128個字元的編碼,例如空格SPACE是32(二進位00100000),大寫的字母A是65(二進位01000001)。這128個符號(包括32個不能印出來的控制符號),只佔用了一個位元組的後面7位,最前面的一位統一規定為0。

ASCII控製字元

字元集編碼ASCII,Unicode和UTF-8你知道多少?字符集編碼匯總(收藏)

#ASCII可顯示字元

字元集編碼ASCII,Unicode和UTF-8你知道多少?字符集編碼匯總(收藏)

二、非ASCII 編碼

英文用128個符號編碼就夠了,但用來表示其他語言,128個符號是不夠的。例如,在法文中,字母上方有註音符號,它就無法用 ASCII 碼表示。於是,一些歐洲國家就決定,利用位元組中閒置的最高位元編入新的符號。例如,法語中的é的編碼為130(二進位10000010)。這樣一來,這些歐洲國家所使用的編碼體系,可以表示最多256個符號。

但是,這裡又出現了新的問題。不同的國家有不同的字母,因此,即使它們都使用256個符號的編碼方式,代表的字母卻不一樣。例如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (ג),在俄語編碼中又會代表另一個符號。但是不管怎樣,所有這些編碼方式中,0--127表示的符號是一樣的,不一樣的只是128--255的這一段。

至於亞洲國家的文字,使用的符號就更多了,漢字就多達10萬左右。一個位元組只能表示256種符號,肯定是不夠的,就必須使用多個位元組來表達一個符號。例如,簡體中文常見的編碼方式是 GB2312,使用兩個位元組表示一個漢字,所以理論上最多可以表示 256 x 256 = 65536 個符號。

中文編碼的問題需要專文討論,這篇筆記不涉及。這裡只指出,雖然都是用多個位元組表示一個符號,但GB類別的漢字編碼與後面的 Unicode 和 UTF-8 是毫無關係的。

三. Unicode

如上一節所說,世界上存在著多種編碼方式,同一個二進位數字可以被解釋成不同的符號。因此,要開啟一個文字文件,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼。為什麼電子郵件常常出現亂碼?就是因為發信人和收信人使用的編碼方式不一樣。

可以想像,如果有一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是 Unicode,就像它的名字都表示的,這是所有符號的編碼。

Unicode 當然是一個很大的集合,現在的規模可以容納100多萬個符號。每個符號的編碼都不一樣,例如,U 0639表示阿拉伯字母Ain,U 0041表示英語的大寫字母A,U 4E25表示漢字嚴。具體的符號對應表,可以查詢unicode.org,或是專門的漢字對應表。

四、Unicode 的問題

#要注意的是,Unicode 只是一個符號集,它只規定了符號的二進位程式碼,卻沒有規定這個二進位代碼應該如何儲存。

例如,漢字嚴的 Unicode 是十六進位數4E25,轉換成二進制數足足有15位元(100111000100101),也就是說,這個符號的表示至少需要2個位元組。表示其他更大的符號,可能需要3個位元組或4個字節,甚至更多。

這裡有兩個嚴重的問題,第一個問題是,如何才能區別 Unicode 和 ASCII ?計算機怎麼知道三個位元組表示一個符號,而不是分別表示三個符號呢?第二個問題是,我們已經知道,英文字母只用一個位元組表示就夠了,如果Unicode 統一規定,每個符號用三個或四個位元組表示,那麼每個英文字母前都必然有二到三個位元組是0,這對於儲存來說是極大的浪費,文字檔案的大小會因此大出二三倍,這是無法接受的。

它們造成的結果是:1)出現了 Unicode 的多種儲存方式,也就是說有許多種不同的二進位格式,可以用來表示 Unicode。 2)Unicode 在很長一段時間內無法推廣,直到網路的出現。

五、UTF-8

網路的普及,強烈要求出現一種統一的編碼方式。 UTF-8 就是一種在網路上使用最廣的一種 Unicode 的實作方式。其他實作方式還包括 UTF-16(字元以兩個位元組或四個位元組表示)和 UTF-32(字元以四個位元組表示),但在網路上基本上不用。重複一遍,這裡的關係是,UTF-8 是 Unicode 的實作方式之一。

UTF-8 最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度。

UTF-8 的編碼規則很簡單,只有二條:

1.對於單字節的符號,位元組的第一位設為0,後面7位為這個符號的Unicode 碼。因此對於英文字母,UTF-8 編碼和 ASCII 碼是相同的。

2.對於n位元組的符號(n > 1),第一個位元組的前n位元都設為1,第n 1位元設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位位,全部都是這個符號的 Unicode 碼。

下表總結了編碼規則,字母x表示可用編碼的位元。

字元集編碼ASCII,Unicode和UTF-8你知道多少?字符集編碼匯總(收藏)

跟據上表,解讀 UTF-8 編碼非常簡單。如果一個位元組的第一位是0,則這個位元組單獨就是一個字元;如果第一位是1,則連續有多少個1,就表示當前字元佔用多少個位元組。

下面,還是以漢字嚴為例,示範如何實作 UTF-8 編碼。

嚴格的Unicode 是4E25(100111000100101),根據上表,可以發現4E25處在第三行的範圍內(0000 0800 - 0000 FFFF),因此嚴格的UTF-8 編碼需要三個字節,即格式是1110xxxx 10xxxxxx 10xxxxxx。然後,從嚴的最後一個二進位位元開始,依序從後向前填入格式中的x,多出的位元補0。這樣就得到了,嚴的 UTF-8 編碼是11100100 10111000 10100101,轉換成十六進位就是E4B8A5。

六、Unicode 與UTF-8 之間的轉換

#透過上一節的例子,可以看到嚴的Unicode碼是4E25,UTF-8 編碼是E4B8A5,兩者是不一樣的。它們之間的轉換可以透過程式實現。

Windows平台,有一個最簡單的轉換方法,就是使用內建的記事本小程式notepad.exe。打開檔案後,點擊檔案選單中的另存為命令,會跳出對話框,在最底部有一個編碼的下拉條。

字元集編碼ASCII,Unicode和UTF-8你知道多少?字符集編碼匯總(收藏)

裡面有四個選項:ANSI,Unicode,Unicode big endian和UTF-8。

  • ANSI是預設的編碼方式。對於英文檔案是ASCII編碼,對於簡體中文檔案是GB2312編碼(只針對 Windows 簡體中文版,如果是繁體中文版會採用 Big5 碼)。

  • Unicode編碼這裡指的是notepad.exe使用的UCS-2 編碼方式,也就是直接用兩個位元組存入字元的Unicode 碼,這個選項用的little endian 格式。

  • Unicode big endian編碼與上一個選項相對應。我在下一節會解釋 little endian 和 big endian 的涵義。

  • UTF-8編碼,也就是上一節談到的編碼方法。

選擇完"編碼方式"後,點選"儲存"按鈕,檔案的編碼方式就立刻轉換好了。

七、Little endian 和Big endian

#上一節已經提到,UCS-2 格式可以儲存Unicode 碼(碼點不超過0xFFFF)。以漢字嚴為例,Unicode 碼是4E25,需要用兩個位元組存儲,一個位元組是4E,另一個位元組是25。儲存的時候,4E在前,25在後,這就是 Big endian 方式;25在前,4E在後,這是 Little endian 方式。

這兩個古怪的名字來自英國作家斯威夫特的《格列佛遊記》。在書中,小人國裡爆發了內戰,戰爭起因是人們爭論,吃雞蛋時究竟是從大頭(Big-endian)敲開還是從小頭(Little-endian)敲開。為了這件事情,前後爆發了六次戰爭,一個皇帝送了命,另一個皇帝失去了王位。

第一個位元組在前,就是"大頭方式"(Big endian),第二個字節在前就是"小頭方式"(Little endian)。

那麼很自然的,就會出現一個問題:電腦怎麼知道某一個檔案到底採用哪一種方式編碼?

Unicode 規範定義,每個檔案的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫做"零寬度非換行空格"(zero width no-break space),用FEFF表示。這正好是兩個字節,而且FF比FE大1。

如果一個文字檔案的前兩個位元組是FE FF,就表示該檔案採用大頭方式;如果前兩個位元組是FF FE,就表示該檔案採用小頭方式。

八、實例

下面,舉出一個實例。

開啟"記事本"程式notepad.exe,新建一個文字文件,內容就是一個嚴字,依序採用ANSI,Unicode,Unicode big endian和UTF-8編碼方式儲存。

然後,用文字編輯軟體UltraEdit 中的"十六進位功能",觀察該檔案的內部編碼方式。

  • ANSI:檔案的編碼就是兩個位元組D1 CF,這正是嚴的 GB2312 編碼,這也暗示 GB2312 是採用大頭方式儲存的。

  • Unicode:編碼是四個位元組FF FE 25 4E,其中FF FE顯示是小頭方式存儲,真正的編碼是4E25。

  • Unicode big endian:編碼是四個位元組FE FF 4E 25,其中FE FF顯示是大頭方式儲存。

  • UTF-8:編碼是六個位元組EF BB BF E4 B8 A5,前三個位元組EF BB BF表示這是UTF-8編碼,後三個E4B8A5就是嚴的具體編碼,它的儲存順序與編碼順序是一致的。

九、延伸閱讀(課外知識)

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets(關於字元集的最基本知識)

談談Unicode編碼:RFC3629:UTF-8, a transformation format of ISO 10646(如果實作UTF-8的規定)

以上是字元集編碼ASCII,Unicode和UTF-8你知道多少?字符集編碼匯總(收藏)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

一個ascii字元佔幾個位元組 一個ascii字元佔幾個位元組 Mar 09, 2023 pm 03:49 PM

一個ascii字元佔1個位元組。 ASCII碼字元在電腦中採用7位元或8位元二進位編碼表示,並保存在一個位元組中,即一個ASCII碼佔用一個位元組。 ASCII碼可分為標準ASCII碼和擴展ASCII碼,其中標準ASCII碼也叫基礎ASCII碼,使用7位二進制數(剩下的1位二進制為0)來表示所有的大寫和小寫字母,數字0到9.標點符號,以及在美式英語中使用的特殊控製字元。

深入了解PHP:JSON Unicode轉中文的實作方法 深入了解PHP:JSON Unicode轉中文的實作方法 Mar 05, 2024 pm 02:48 PM

深入了解PHP:JSONUnicode轉中文的實作方法在開發中,我們經常會遇到需要處理JSON資料的情況,而JSON中的Unicode編碼在一些場景下會為我們帶來一些問題,特別是當需要將Unicode編碼轉換為中文字元時。在PHP中,有一些方法可以幫助我們實現這個轉換過程,以下將介紹常用的方法,並提供具體的程式碼範例。首先,讓我們先來了解一下JSON中Un

快速了解 PHP 中的 ASCII 數值轉換 快速了解 PHP 中的 ASCII 數值轉換 Mar 28, 2024 pm 06:42 PM

PHP中的ASCII數值轉換是程式設計中常會遇到的問題。 ASCII(AmericanStandardCodeforInformationInterchange)是一種用於將字元轉換為數字的標準編碼系統。在PHP中,我們經常需要透過ASCII碼來實現字元和數字之間的轉換。本文將介紹如何在PHP中進行ASCII數值轉換,並給予具體的程式碼範例。一、將字符

unicode怎麼轉中文 unicode怎麼轉中文 Dec 14, 2023 am 10:57 AM

Unicode是一種字元編碼標準,用於表示各種語言和符號。若要將Unicode編碼轉換為中文字符,可使用Python的內建函數chr()和ord()。

解決Eclipse中文亂碼問題的方法試試看 解決Eclipse中文亂碼問題的方法試試看 Jan 03, 2024 pm 05:28 PM

Eclipse中文亂碼困擾?試試這些解決方案,需要具體程式碼範例一、背景介紹隨著電腦科技的不斷發展,中文在軟體開發中扮演越來越重要的角色。然而,許多開發者在使用Eclipse進行中文開發時會遇到亂碼問題,影響了工作效率。那麼,本文將介紹一些常見的亂碼問題,並給出對應的解決方案及程式碼範例,幫助讀者解決Eclipse中文亂碼問題。二、常見亂碼問題及解決方案文件

PHP傳回字串第一個字元的 ASCII 值 PHP傳回字串第一個字元的 ASCII 值 Mar 21, 2024 am 11:01 AM

這篇文章將為大家詳細講解有關PHP返回字符串第一個字符的ASCII值,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP傳回字串第一個字元的ASCII值引言在php中,取得字串第一個字元的ASCII值是一個常見的操作,涉及到字串處理和字元編碼基礎知識。 ASCII值用於表示字元在電腦系統中的數字值,對於字元比較、資料傳輸和儲存至關重要。過程取得字串第一個字元的ASCII值涉及以下步驟:取得字串:確定要取得ASCII值的字串。它可以是變數、字串常數

PHP教學:如何將JSON Unicode轉換為中文字符 PHP教學:如何將JSON Unicode轉換為中文字符 Mar 05, 2024 pm 06:36 PM

JSON(JavaScriptObjectNotation)是一種輕量級的資料交換格式,通常用於Web應用程式之間的資料交換。在處理JSON資料時,我們經常會遇到Unicode編碼的中文字元(例如"u4e2du6587"),需要將其轉換為可讀的中文字元。在PHP中,我們可以透過一些簡單的方法來實現這個轉換。接下來,我們將詳細介紹如何將JSONUnico

解決Java連接MySQL資料庫時Unicode字元集編碼不一致的問題 解決Java連接MySQL資料庫時Unicode字元集編碼不一致的問題 Jun 10, 2023 am 11:39 AM

隨著大數據、雲端運算等技術的發展,資料庫成為了企業資訊化的重要基石之一。在Java開發的應用程式中,連接MySQL資料庫已成為常態。然而,在這個過程中,我們常常會遭遇一個棘手的問題──Unicode字元集編碼不一致。這不僅會影響我們的開發效率,還會影響應用程式的效能和穩定性。本文將介紹如何解決這個問題,讓Java連接MySQL資料庫更順暢。一、Unicode

See all articles