[英]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 的詞匯表是這樣描述的:
統一碼
- 用於書寫世界上所有語言的字符的數字表示標准。 Unicode 提供了一種統一的方式來存儲、搜索和交換任何語言的文本。 它被所有現代計算機使用,是處理 Internet 文本的基礎。 Unicode 由 Unicode Consortium 開發和維護: http : //www.unicode.org 。
- 應用於由 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.