簡體   English   中英

UTF-8 是編碼還是字符集?

[英]Is UTF-8 an encoding or a character set?

我認為字符集的名稱是“Unicode”,而“UTF-8”是 Unicode 字符集的特定編碼的名稱,但我經常看到術語“編碼”和“字符集”在提及時互換使用到 UTF-8。

例如,

<meta charset="UTF-8">

對比

<?xml version="1.0" encoding="UTF-8" ?>

UTF-8 是編碼還是字符集?

UTF-8 是一種編碼,該術語在定義它的 RFC 中使用,下面引用。


我經常看到術語“編碼”和“字符集”互換使用

在 Unicode 出現之前,如果您想使用像西里爾字母或希臘字母這樣的字母†,您需要使用一種僅編碼為該字母中字符的編碼。 因此,術語編碼字符集經常被混為一談,但它們的含義不同。

但是現在,Unicode 通常是您需要擔心的唯一字符集,因為它包含您必須處理的大多數書面語言的字符,克林貢語除外。

† - 字母表,一種字符集,其中字符直接對應於口語中的聲音。


字符集是從代碼單元(整數)到字符、符號、字形或書面語言中的其他標記的映射。 Unicode 是將 21b 整數映射到 unicode 代碼點的字符集。 Unicode Consortium 的詞匯表是這樣描述的:

統一碼

  1. 用於書寫世界上所有語言的字符的數字表示標准。 Unicode 提供了一種統一的方式來存儲、搜索和交換任何語言的文本。 它被所有現代計算機使用,是處理 Internet 文本的基礎。 Unicode 由 Unicode Consortium 開發和維護: http : //www.unicode.org
  2. 應用於由 Unicode Consortium 開發和維護的軟件國際化和本地化標准的標簽。

編碼是從字符串到字符串的映射。 UTF-8 是一種將字節字符串(8b 整數)映射到代碼點字符串(21b 整數)的編碼。 Unicode Consortium 將其稱為“字符編碼方案”,並在RFC 3629 中進行了定義。

然而,最初提出的 UCS 編碼與許多當前的應用程序和協議不兼容,這導致了 UTF-8 的發展

UTF-8是一種編碼,在其編碼抽象整數序列有義-的unicode的碼點其指示抽象字符-成一組字節。 (通過 unicode 眼鏡,您可以說像ISO-8859-1這樣的“字符集”也是表驅動的“編碼”,因為它將少量代碼點編碼為字節,但這接近於濫用術語,可能不是很有幫助)。

整數序列(在某種基本意義上)是“unicode 字符串”,但為了將它們保存在磁盤上或通過網絡發送它們,您需要將它們編碼為字節序列。 UTF-8 是一種方法,UTF-16 是另一種:如果以兩種不同的方式編碼,一個 unicode 字符串將表示為兩個不同的字節流。


這里有多個很好的答案,但就在昨天,我花了一些時間試圖將這個問題歸結為最小的大小,因此這提供了一個重用該文本的好機會:

我認為,Joel Spolsky 關於每個軟件開發人員絕對、肯定必須了解 Unicode 和字符集(沒有借口!)的絕對最小值的文章非常好。 之前(肯定)在這里提到過,但值得重復。 不過,我認為這並不完全是最小的。

有幾次我不得不向同事解釋“unicode”時,抽象 Unicode 代碼點的概念被證明是照明的關鍵。 我成功的解釋的結構是這樣的:

  • Unicode 聯盟(經過許多痛苦和協商)設法為大部分正在使用的字符提供了一個數字 這些數字(行話)稱為“代碼點”。

  • 'The Letter A' 有一個代碼點,這與字體無關。 因此,'A' 和 'a' 具有不同的代碼點,但不區分羅馬、粗體、斜體、襯線、無襯線(等等)。 日語 kanji、tengwar 和 klingon 字符(例如)有代碼點(這會引起注意)。

  • 'unicode string' 是(概念上的)代碼點序列。 這是一個數學整數序列。 詢問這些是字節、2 字節還是 4 字節字是沒有意義的; 該序列與計算機無關。

  • 但是,如果您想將該整數序列發送給某人,或將其保存在計算機磁盤上,則必須對其進行編碼。 您也可以在一張紙上寫下數字序列,但現在讓我們專門研究計算機。 如果要在計算機上存儲或發送它,則必須將這些整數轉換為字節序列。 有多個過程可以做到這一點,並且這些過程中的每一個都被命名為“編碼”。 這些“編碼”之一是 UTF-8。

  • 當您“讀取 Unicode 文件”時,您從磁盤上的字節序列開始,並在概念上以整數序列結束。 如果以某種方式指示“unicode 文件”以 UTF-8 編碼,則您必須使用RFC 3629 中定義的算法對該字節序列進行解碼以獲取整數序列。 'unicode string' 上的所有后續操作都是根據代碼點序列定義的,並且忘記了它在磁盤上作為 'UTF-8' 開始的事實。

Unicode 標准將其稱為編碼形式編碼方案 Unicode 有一組字符(稱為 Unicode 字符集或通用字符集),所有 UTF編碼形式編碼方案都可以編碼該集中的所有字符。

與許多其他術語一樣,程序員似乎傾向於到處亂用術語,這只是另一個例子。

UTF-8 是一種編碼。 然而,編碼通常稱為字符集,因此許多協議使用參數名稱charset作為指定字符編碼的參數。 因此, charset只是一個標識符。

從所有可能的來源來看,UTF-8 被命名為encoding ,而不是charset ,句點。

然而,它是由 Unicode 標准定義的,主要用於對 Unicode 字符集進行編碼。 只需檢查 UTF 首字母縮略詞的含義: Unicode Transformation Format 它甚至提供了與一些以前的字符集(如 ASCII)的向后兼容性。 因此,從實用的角度來看,使用 UTF-8 對 Unicode 以外的字符集進行編碼是非常不尋常的。

這可能是在某些情況下不准確地將 UTF-8 用作字符集的根源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM