什麼是UTF-8編碼?寫給計算機愛好者

Text-文本:

文本在互聯網上的重要性就不用多說瞭。就連"HTTP"中的第一個字母都是"T","HTML"中唯一的一個"T",幾乎每個網站都以某種方式使用它,無論是URL,廣告,產品預發佈,病毒式推文還是博客文章都基本以文本的方式實現。

但是,Web中的text實際上可能並不像我們所想象的那麼簡單。例如:今天我們人類擁有數千種語言,或者我們創造瞭新的標點和符號來描述新的事物,或者我們使用新的表情符號來表達每個人的情感。那麼,網站如何存儲和處理所有這些呢?事實是,即使是像文本這樣基本的東西也需要一個定義明確的規范,並系統性的出現在Web瀏覽器中。在這篇文章中,我將解釋一種以處理文本為中心的技術UTF-8的基礎知識。我們將學習文本存儲和編碼的基礎知識,並討論它如何幫助在您的網站上放置一些SEO高頻的詞匯。

在我們開始之前,我們應該熟悉HTML的基礎知識,並準備好深入研究一些輕量級的計算機科學。

什麼是 UTF-8?

UTF-8 代表"Unicode Transformation Format -8 bits"。

二進制文件:計算機如何存儲信息

為瞭存儲信息,計算機使用二進制系統。在二進制中,所有數據都以 1 和 0 的序列表示。二進制的最基本單位是bit(位),它隻是一個1或0。第二個最大的二進制單位,一個type(字節),由8位組成。字節的一個例子是"01101011"。

你遇到的每一個數字空間——從軟件到移動應用程序,從網站到知乎的解釋——都是基於這個字節系統構建的,這些字節以一種對計算機有意義的方式串在一起。當我們引用文件大小時,我們引用的是字節數。例如,千字節大約是一千字節,一千兆字節大約是十億字節。

文本是計算機存儲和處理的眾多資產之一。文本由單個字符組成,每個字符在計算機中由一串位表示。這些字符串被組合成數字單詞,句子,段落,浪漫小說等。

ASCII:將交易品種轉換為二進制

美國信息交換標準代碼(ASCII)是文本的早期標準化編碼系統。編碼是將人類語言中的字符轉換為計算機可以處理的二進制序列的過程。

ASCII 的庫包括拉丁字母表中的每個大寫和小寫字母(A、B、C…)、從 0 到 9 的每個數字以及一些常用符號(如 /、! 和 ?)。它為每個字符分配一個唯一的三位數代碼和一個唯一的字節。

下表顯示瞭 ASCII 字符及其關聯代碼和字節的示例。

Character ASCII Code BYTE
A 065 01000001
a 097 01100001
B 066 01000010
b 098 01100010
Z 090 01011010
z 122 01111010
0 048 00110000
9 057 00111001
! 033 00100001
? 063 00111111

正如字符組合在一起形成語言中的單詞和句子一樣,二進制代碼在文本文件中也是如此。因此,ASCII二進制中表示的句子"The quick brown fox jumps over the lazy dog."將是:

  1. 01010100 01101000 01100101 00100000 01110001
  2. 01110101 01101001 01100011 01101011 00100000
  3. 01100010 01110010 01101111 01110111 01101110
  4. 00100000 01100110 01101111 01111000 00100000
  5. 01101010 01110101 01101101 01110000 01110011
  6. 00100000 01101111 01110110 01100101 01110010
  7. 00100000 01110100 01101000 01100101 00100000
  8. 01101100 01100001 01111010 01111001 00100000
  9. 01100100 01101111 01100111 00101110

這對我們人類來說意義不大,但它是計算機的來水就是生活必需品瞭。

ASCII 可以表示的字符數僅限於可用的唯一字節數,因為每個字符都有一個字節。如果你做數學計算,你會發現有256種不同的方式將8個1和0組合在一起。這為我們提供瞭 256 個不同的字節,或 256 種在 ASCII 中表示字符的方法。當 ASCII 在 1960 年推出時,這沒關系,因為開發人員隻需要 128 個字節來表示他們需要的所有英文字符和符號。

但是,隨著計算在全球范圍內的擴展,計算機系統開始以英語以外的語言存儲文本,其中許多語言使用非ASCII字符。創建瞭新系統以將其他語言映射到同一組256個唯一字節,但是具有多個編碼系統是低效且令人困惑的。開發人員需要一種更好的方法來使用一個系統對所有可能的字符進行編碼。

Unicode:一種存儲每個符號的方法

輸入 Unicode,這是一種解決 ASCII 空間問題的編碼系統。與 ASCII 一樣,Unicode 為每個字符分配一個唯一的代碼,稱為一個code point。但是Unicode 更復雜的系統可以生成超過一百萬個point(組合),足以解釋任何語言中的每個字符。

Unicode現在是編碼所有人類語言的通用標準。更有意思的是,它甚至包括表情符號。

以下是文本字符及其匹配代碼點的一些示例。每個碼位以"U"開頭,表示"Unicode",後跟一個唯一的字符串來表示該字符。

Character Code point
A U+0041
a U+0061
0 U+0030
9 U+0039
! U+0021
Ø U+00D8
U+0683
U+0C9A
U+2070E
U+1F601

如果您想瞭解points是如何生成的以及它們在 Unicode 中的含義,(in-depth explanation))。

因此,我們現在有瞭一種標準化的方式來表示單詞庫中每種人類語言使用的每個字符。這解決瞭不同語言的多個標簽系統的問題 – 地球上的任何計算機都可以使用Unicode。

但是,Unicode 本身不會以二進制形式存儲單詞。計算機需要一種方法將Unicode 轉換為二進制代碼,以便其字符可以存儲在文本文件中。這就是 UTF-8 的用武之地。

UTF-8:正式出場瞭

UTF-8 是 Unicode 的編碼系統。它可以將任何 Unicode 字符轉換為匹配的唯一二進制字符串,還可以將二進制字符串轉換回 Unicode字符。這就是"UTF"或"Unicode Transformation Format"的含義。

除瞭 UTF-8 之外,還有其他Unicode編碼系統,但UTF-8是唯一的,因為它以一字節單位表示字符。請記住,一個字節由八位組成,因此其名稱中為後綴"-8"。

更具體地說,UTF-8將code points(在 Unicode中表示單個字符)轉換為一到四個字節的集合。Unicode 庫中的前 256 個字符(包括我們在 ASCII 中看到的字符)表示為一個字節。稍後在 Unicode 庫中出現的字符被編碼為兩字節、三字節,最終是四字節二進制單位。

下面是上面的相同字符表,並添加瞭每個字符的 UTF-8 輸出。請註意,某些字符僅表示為一個字節,而其他字符則使用更多字節。

Character Code point UTF-8 binary encoding
A U+0041 01000001
a U+0061 01100001
0 U+0030 00110000
9 U+0039 00111001
! U+0021 00100001
Ø U+00D8 11000011 10011000
U+0683 11011010 10000011
U+0C9A 11100000 10110010 10011010
U+2070E 11110000 10100000 10011100 10001110
U+1F601 11110000 10011111 10011000 10000001

為什麼UTF-8會將某些字符轉換為一個字節,而將其他字符轉換為四個字節?簡而言之,為瞭節省內存。通過使用較少的空間來表示更常見的字符(即 ASCII 字符),UTF-8減小瞭文件大小,同時允許使用大量不太常見的字符。這些不太常見的字符被編碼為兩個或更多字節,但如果它們被謹慎存儲,這是可以的。

空間效率優先是UTF-8編碼的關鍵優勢。相反,如果每個Unicode字符都由四個字節表示,則用英語編寫的文本文件的大小將是使用 UTF-8 編碼的同一文件的四倍。

UTF-8 編碼的另一個優點是它向後兼容 ASCII。Unicode 庫中的前128個字符與 ASCII庫中的字符匹配,UTF-8將這128個Unicode字符轉換為與ASCII相同的二進制字符串。因此,UTF-8 可以采用 ASCII 格式的文本文件,並將其轉換為人類可讀的文本,而不會出現問題。

UTF-8 Web 開發中的常用字符

UTF-8是當今互聯網上最常用的字符編碼方法,也是HTML5的默認字符集。超過95%的網站(可能包括您自己的網站)以這種方式存儲字符。此外,網絡上常見的數據傳輸方法,如XML和JSON,都使用UTF-8標準進行編碼。

由於它現在是在 Web 上編碼文本的標準方法,因此我們建議頁面和數據庫都應使用UTF-8,但中文字符集也可用GB2312和GBK。默認情況下,內容管理系統或網站構建器會以UTF-8字符集保存文件。

使用 UTF-8 編碼的文本文件必須向處理它的軟件指示這一點。否則,軟件將無法正確將二進制文件轉換回字符。在 HTML 文件中,您可能會在頂部附近看到一串代碼,如下所示:

  1. <meta charset="UTF-8">

這會告訴瀏覽器 HTML 文件由UTF-8編碼,以便瀏覽器可以將其翻譯回清晰的文本。

UTF-8 與 UTF-16

正如我所提到的,UTF-8不是Unicode字符的唯一編碼方法,還有UTF-16。這些方法的不同之處在於它們存儲字符所需的字節數。UTF-8 將字符編碼為一個、兩個、三個或四個字節的二進制字符串。UTF-16 將 Unicode 字符編碼為兩個或四個字節的字符串。

這種區別從他們的名字中可以明顯看出。在UTF-8中,字符的最小二進制表示形式是一個字節或八位。在UTF-16中,字符的最小二進制表示形式是兩個字節或十六位。

UTF-8和UTF-16都可以將 Unicode 字符轉換為計算機友好的二進制文件,然後再轉換回來。但是,它們彼此不兼容。這些系統使用不同的算法將代碼點映射到二進制字符串,因此任何給定字符的二進制輸出看起來都與這兩種方法不同:

Character UTF-8 binary encoding UTF-16 binary encoding
A 01000001 01000001 11011000 00001110 11011111
11110000 10100000 10011100 10001110 01000001 11011000 00001110 11011111

在大多數網站上,UTF-8 編碼比UTF-16 更可取,因為它使用的內存更少。回想一下,UTF-8僅將每個ASCII字符編碼為一個字節。UTF-16必須以兩個或四個字節對這些相同的字符進行編碼。這意味著使用 UTF-16 編碼的英語文本文件的大小至少是使用 UTF-8 編碼的同一文件的兩倍。

在某些非英語網站上,UTF-16僅比UTF-8 更有效。如果網站使用的語言在Unicode 庫中包含更遠的字符,則UTF-8會將所有字符編碼為四個字節,而UTF-16可能會將許多相同的字符編碼為僅兩個字節。不過,如果您的頁面充滿瞭ABC和123,請堅持使用UTF-8。

解碼 UTF-8 編碼的世界

這是關於單詞的很多單詞,所以讓我們總結一下我們已經涵蓋的內容:

  • 計算機將數據(包括文本字符)存儲為二進制(1 和 0)。
  • ASCII是一種早期的編碼方式,或將字符映射到二進制代碼,以便計算機可以存儲它們。但是,ASCII 沒有為非拉丁字符和數字提供足夠的空間,使其以二進制表示。
  • Unicode是這個問題的解決方案。Unicode 為每種語言中的每個字符分配一個唯一的"碼位"。
  • UTF-8 是一種 Unicode 字符編碼方法。這意味著 UTF-8 獲取給定 Unicode 字符的碼位,並將其轉換為二進制字符串。它也執行相反操作,以二進制數字讀取並將它們轉換回字符。
  • UTF-8是目前互聯網上最流行的編碼方法,因為它可以有效地存儲包含任何字符的文本。
  • UTF-16 是另一種編碼方法,但存儲文本文件的效率較低(以某些非英語語言編寫的文件除外)。
  • Unicode翻譯並不是我們大多數人在瀏覽或設計網站時需要考慮的事情,這正是重點 – 創建一個適用於所有語言和Web瀏覽器的無縫文本處理系統。如果它工作正常,您不會註意到它。

但是,如果您發現您網站的頁面占用瞭過多的空間,或者您的文本中充斥著▢和s,那麼是時候將您的UTF-8新知識投入使用瞭。

英文原文:What is UTF-8

什麼是UTF-8編碼?寫給計算機愛好者 | 庫次元宇宙 (qooqoometa.com)

赞(0)