UTF-8 位元組大小計算機
輸入
| 文字 | Héllo |
|---|
UTF-8 位元組大小計算機
輸入任意文字,即可得知其 UTF-8 位元組大小、UTF-16 位元組大小,以及字元數(碼位數)。ASCII 字元在 UTF-8 中每個佔 1 位元組,帶重音的拉丁字母佔 2 位元組,中文等多數文字佔 3 位元組,表情符號佔 4 位元組,因此字串的位元組大小可能比看到的字元數還多。
輸入
文字
結果
輸入數值即可顯示計算結果。
大小
UTF-8 位元組大小
一段文字字串和它所佔的位元組數並不是同一回事。在螢幕上,一個詞是一串字元;在儲存與傳輸中,它是一串位元組,而這兩個數字很少相同。這個計算機接收一段文字,並回傳三個數字:它含有多少字元(Unicode 碼位)、以 UTF-8 佔多少位元組、以 UTF-16 佔多少位元組。它有助於規劃資料庫欄位大小、檢查 API 與訊息長度上限,以及理解為何看似很短的字串會出乎意料地大。
字元與位元組
字元是書寫的單位:一個字母、一個數字、一個表意文字、一個表情符號。Unicode 為每一個指定一個稱為碼位的數字,寫成如 U+00E9。位元組是儲存的單位,由八個位元組成。編碼是把碼位轉成位元組的規則,而不同的編碼對同一段文字會產生不同的位元組數。
對純英數文字而言,這個差別容易被忽略,因為在常見編碼中每個 ASCII 字元剛好是整數個位元組。一旦文字含有重音字母、中文等非拉丁文字或表情符號,差距就會浮現。
UTF-8 如何計算一個字元
UTF-8 是可變長度編碼:一個字元依其碼位佔 1 至 4 個位元組。
U+0000–U+007F(ASCII:不帶重音的拉丁字母、數字、常見標點):1 位元組U+0080–U+07FF(拉丁重音、希臘文、西里爾文、希伯來文、阿拉伯文):2 位元組U+0800–U+FFFF(中文等多數 CJK 與其他文字):3 位元組U+10000以上(表情符號與罕見字元):4 位元組
由於 ASCII 字元仍為 1 位元組,UTF-8 與 ASCII 向後相容,這也是它成為網路與文字檔案預設編碼的重要原因。
UTF-16 如何計算一個字元
UTF-16 把多數字元存放在單一的 16 位元碼元中,也就是兩個位元組。U+FFFF 以上的字元(表情符號與其他罕見符號)會以兩個碼元組成的代理對儲存,因此佔四個位元組。它沒有單一位元組的情況:即使是普通的 ASCII 字母,在 UTF-16 中也要兩個位元組。這是 Java、C#、JavaScript 等語言在記憶體中所用的字串格式。
範例計算
以文字 Héllo 為例。
有 5 個字元,卻有 6 個 UTF-8 位元組,因為 é 落在兩位元組的範圍。在 UTF-16 中,這 5 個字元各為一個兩位元組碼元,合計 10 位元組。
再看單一表情符號 😀(U+1F600)。它是一個字元,但位於 U+FFFF 之上。UTF-8 以四個位元組編碼,UTF-16 以代理對儲存,同樣是四個位元組——然而字元數只有 1。
為何位元組大小重要
真實系統中的上限通常以位元組而非字元計算。VARCHAR(255) 欄位會依資料庫與字元集限制位元組或字元;訊息長度限制、API 酬載欄位、HTTP 標頭大小與表單驗證也常以位元組表示。事先測得 UTF-8 位元組大小,便能判斷某個值是否放得下,以及它會佔用多少空間或頻寬——這是單看字元數所無法得知的。
相關計算機
若要查看字串實際的位元組值(以二進位、十六進位與十進位碼表示),請使用 文字轉二進位 / 十六進位 / ASCII 轉換器。若要測量文字以 Base64 包裝後用於傳輸的大小,請參見 Base64 編碼開銷計算機。若要估計字串所攜帶的資訊量,而非它所佔的空間,夏農熵計算 會計算其熵。
常見問題(FAQ)
為什麼位元組大小比字元數還多?
字元是你看到的東西,位元組是它的儲存方式。在 UTF-8 中,只有基本的 ASCII 字元(不帶重音的拉丁字母、數字、常見標點)能放進單一位元組。像 é 這類帶重音的字母佔 2 位元組,多數其他文字佔 3 位元組,表情符號佔 4 位元組。因此任何含有非 ASCII 字元的文字,所佔位元組都會比字元數多。
在 UTF-16 中,由於每個字元至少佔 2 位元組,對 ASCII 文字而言差距更大。
UTF-8 與 UTF-16 有什麼不同?
兩者都是把 Unicode 字元轉成位元組的方式。UTF-8 採用每字元 1 至 4 位元組的可變長度,並與 ASCII 向後相容,因此成為網路與檔案中最主流的編碼。UTF-16 對多數字元使用 2 位元組,對基本多文種平面(BMP)之外的罕見字元(如表情符號)使用 4 位元組;它是 Java、C#、JavaScript 等語言常見的記憶體內字串表示法。
對以拉丁文字為主的文字,UTF-8 較精簡;對以東亞文字為主的文字,兩者往往相當。
一個字元佔幾個位元組?
在 UTF-8 中取決於碼位:U+0000–U+007F(ASCII)為 1 位元組,U+0080–U+07FF(拉丁重音、希臘文、西里爾文、希伯來文、阿拉伯文)為 2 位元組,U+0800–U+FFFF(多數 CJK 與其他文字)為 3 位元組,U+10000 以上(表情符號、罕見字元)為 4 位元組。
在 UTF-16 中,相同字元在 U+FFFF 以下佔 2 位元組,超過時則以代理對(surrogate pair)儲存,佔 4 位元組。
位元組大小在什麼情況下重要?
儲存與傳輸是以位元組而非字元來計算的。宣告為 VARCHAR(255) 的資料庫欄位,會依資料庫引擎與字元集而限制位元組或字元;API 欄位、訊息長度上限與表單驗證也常以位元組表示。事先知道 UTF-8 位元組大小,有助於預判某個值是否放得下,以及會佔用多少空間或頻寬。