2012-03-02 49 views
54

單個UTF-8編碼字符的最大字節數是多少?UTF-8編碼字符的最大字節數是多少?

我將加密以UTF-8編碼的字符串的字節,因此需要能夠計算出UTF-8編碼字符串的最大字節數。

有人能確認的最大字節數爲單個UTF-8編碼的字符請

+1

你*看*普通資源,如[維基百科的UTF-8文章](http://en.wikipedia.org/wiki/UTF-8),第一個......對嗎? – 2012-03-02 12:38:43

+3

我閱讀了幾篇文章,其中給出了混合的答案......其實我得到的印象是答案是3,所以我很高興我問 – Edd 2012-03-02 12:43:53

+1

我將在這裏留下一個YouTube鏈接,其中包含Tom Scott的Characters,Symbols,Unicode奇蹟:https: //goo.gl/sUr1Hf。你會聽到並看到一切從ASCII字符編碼發展到utf-8。 – Roylee 2015-12-24 11:36:07

回答

61

每字符的最大字節數爲4,根據RFC3629,其限制了字符表U+10FFFF

在UTF-8中,來自U + 0000..U + 10FFFF範圍(UTF-16 可訪問範圍)的字符使用1到4個八位字節的序列進行編碼。

(原始規範允許多達六個字節字符碼爲過去U+10FFFF代碼點。)

性狀與小於128的碼將僅需要1個字節,而下一個1920字符代碼要求2只有字節。除非你使用一種深奧的語言,否則將字符數乘以4將會導致高估。

+2

什麼是你的「esotheric語言」?在現實世界中會存在的任何語言,還是在世界不同語言之間切換的文本?如果UTF-8到字符串函數的開發者選擇2,3或4作爲乘數,如果他進行了過度分配並且在實際轉換後縮小了結果? – 2014-06-06 07:35:54

+1

@rinntech by'esoteric language'他指的是一種語言,它有很多高價值的unicode字符(來自這個列表底部的東西:http://unicode-table.com/en/sections/)。如果您必須過度分配,請選擇4.您可以執行雙重傳遞,其中一個可以查看您需要分配多少個字節,然後另一個執行編碼;這可能比分配~4倍所需RAM更好。 – matiu 2014-09-10 19:36:22

+4

總是嘗試處理最糟糕的情況:http://www.hacker9.com/single-message-can-crash-whatsapp.html – 2015-12-23 07:51:29

22

如果沒有進一步的情況下,我要說的是字節爲UTF-8字符的最大數量爲

回答:6個字節

接受答案的作者正確地指出了這一點,作爲「原始規範「,但我認爲這會誤導讀者,因爲據我所知,這仍然是當前和正確的規範,根據wikipedia和每a Google book on UTF-8 in Java

在接受答案的狀態,只有四個字節是相關的UTF-16編碼中引用的RFC,所以這是正確的,只有當我們添加背景

的答案,如果從UTF-16轉換隻字符UTF- 8:4字節

現在,所有可以用UTF-16表示的字符都有用嗎?根據wikipedia again,unicode最多可以表示x10FFFF代碼點。因此,包括0,這意味着我們可以用這些字節來完成:F FF FF,即2.5字節或20位。回顧一下UTF-8規範,我們看到我們可以用最多四個UTF-8編碼字節表示20位。所以,如果覆蓋所有Unicode

回答:4個字節

但是,Java <= v7,他們談了3個字節的最大的代表與UTF-8的Unicode?這是因爲原始的unicode規範僅定義了基本的多語言平面(BMP),即它是舊版本的unicode或現代unicode的子集。因此,如果僅代表初始unicode的BMP

回答:3個字節

但是,關於走另一條路的OP會談。不是從字符到UTF-8字節,而是從UTF-8字節到字節表示的「字符串」。也許被接受的答案的作者從問題的背景中得到了答案,但這不一定是明顯的,所以可能會混淆這個問題的臨時讀者。

從UTF-8到本地編碼,我們必須看看如何實現「字符串」。某些語言,如Python> = 3,將用整數代碼點表示每個字符,這允許每個字符4個字節= 32位來覆蓋我們需要的Unicode,這有些浪費。爲什麼不準確20位?因爲字節對齊時事情會更快。 Python < = 2和Java等一些語言表示使用UTF-16編碼的字符,這意味着它們必須使用代理對來表示擴展unicode(而不是BMP)。無論哪種方式,最多仍然是4個字節。如果

答案去UTF-8 - >本地編碼:4個字節

所以,最後的結論,4是最常見的正確答案,所以我們得到了它的權利。但是,在某些情況下,你應該小心。例如,不要指望您可以表示您從UTF-8流中讀取的最多4個字節的內容。如果它不是unicode,則可能需要多達6個字節。

+1

「這仍然是當前和正確的規格,每維基百科」 - 不再。在你寫這個(4月2日編輯)後不久,維基百科的UTF-8文章發生了變化,以澄清6字節版本不是當前(2003)UTF-8規範的一部分。 – 2016-08-27 01:50:23

+0

「但是,在Java <= v7中,他們提到使用UTF-8代表unicode的最大長度爲3個字節?這是因爲原始unicode規範只定義了基本的多語言平面」 - 這可能是原始原因,但這不是全部。 Java使用「修改後的UTF-8」,其中一項修改是「使用自己的兩倍三字節格式」而不是「標準UTF-8的四字節格式」(他們的話)。 – 2016-08-27 01:52:04

+0

在10FFFF(超過一百萬)限制之上沒有分配代碼點,許多UTF8實現從未實現過長於4個字節的序列(有些只有3個,例如MySQL),所以我認爲將硬限制爲4字節是安全的即使在考慮與舊版本的兼容性時也是如此。你只需要確保你丟棄任何無效的東西。請注意,matiu在計算確切字節長度後分配的建議是可行的。 – thomasrutter 2017-05-25 04:53:20