UTF-8可以編碼5或6字節的序列,允許編碼所有的Unicode字符嗎?我遇到了衝突的標準。我需要能夠支持每個Unicode字符,而不僅僅是U + 0000..U + 10FFFF範圍內的那些字符。6個八位字節的UTF-8序列是否有效?
(股價從RFC 3629)
第3部分:
在UTF-8,從U + 0000..U + 10FFFF範圍字符(UTF-16 訪問範圍)使用1到4個八位字節的序列進行編碼。只有一個「序列」的八位字節具有設置爲0的高位比特,其餘的7比特用於編碼字符編號。在n個八位字節的序列中,n> 1時,初始八位字節將n個高位 比特設置爲1,隨後將比特設置爲0.其餘位( )中的八位字節包含來自該數字的比特的字符被編碼爲 。以下八位組的所有高位比特都被設置爲 1,並且隨後的比特被設置爲0,每個比特中的6比特包含來自要編碼的字符的 比特。
那麼不是所有可能的字符都可以用UTF-8編碼嗎?這是否意味着我不能對不同於BMP的字符進行編碼?
第2部分:
的八位組值C0,C1,F5至FF永遠不會出現。
這意味着我們無法使用5或6個八位字節(或甚至一些4個不在上述範圍內)編碼UTF-8值?
第12節:
限制字符0000-10FFFF的範圍(UTF-16 訪問範圍)。
看着前面的RFC證實了這一點...他們減少了字符的範圍。
第10節:編碼爲UTF-8時
發生另一個安全問題:的ISO/IEC 10646描述UTF-8允許編碼的字符數達 U + 7FFFFFFF,得到了序列到6個字節。因此,如果字符數範圍不是明確限制爲U + 10FFFF,或者如果緩衝區大小沒有考慮到 說明5字節和6字節序列的可能性,則存在緩衝區溢出的風險。
因此,根據ISO/IEC 10646定義允許這些序列,但不允許RFC 3629定義?我應該遵循哪一個?
在此先感謝。
謝謝,這是有道理的。這是否意味着我只需要擔心長度超過4個八位字節的UTF-8序列,並且任何更長的時間都是錯誤? – 2010-08-24 20:23:32
@PatrickNiedzielski是的,但你必須把它們當作錯誤('MUST')。 – 2016-08-27 17:37:43
@devio,當他們展開它時,在將來的Unicode版本中怎麼樣? – Pacerier 2017-03-20 09:20:19