3 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
根據(jù)RFC3629,每個(gè)字符的最大字節(jié)數(shù)為4,該字符將字符表限制為U+10FFFF:
在UTF-8中,使用1到4個(gè)八位位組的序列對(duì)U + 0000..U + 10FFFF范圍(UTF-16可訪問范圍)中的字符進(jìn)行編碼。
(原始規(guī)范允許對(duì)過去的代碼點(diǎn)最多使用六個(gè)字節(jié)的字符代碼U+10FFFF。)
代碼少于128個(gè)字符的字符僅需要1個(gè)字節(jié),接下來的1920個(gè)字符代碼僅需要2個(gè)字節(jié)。除非您使用的是深?yuàn)W的語言,否則將字符數(shù)乘以4將是一個(gè)明顯的高估。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果沒有進(jìn)一步的上下文,我想說的是,UTF-8中字符的最大字節(jié)數(shù)為
答案:6個(gè)字節(jié)
接受的答案的作者正確地指出這是“原始規(guī)范”。這通過RFC-2279 1是有效的。正如J. Cocoe在下面的評(píng)論中指出的那樣,此情況在2003年通過RFC-3629 2進(jìn)行了更改,RFC-3629 2將UTF-8的編碼范圍限制為21位,可以使用四個(gè)字節(jié)的編碼方案進(jìn)行處理。
如果覆蓋所有unicode,則回答:4個(gè)字節(jié)
但是,在Java <= v7中,他們談?wù)撌褂肬TF-8表示unicode的最大3字節(jié)嗎?這是因?yàn)樵紆nicode規(guī)范僅定義了基本的多語言平面(BMP),即它是unicode的較舊版本,或者是現(xiàn)代unicode的子集。所以
如果僅代表原始unicode,則回答B(yǎng)MP:3個(gè)字節(jié)
但是,OP談?wù)摰氖橇肀賕oing徑。不是從字符到UTF-8字節(jié),而是從UTF-8字節(jié)到字節(jié)表示的“字符串”。也許接受的答案的作者是從問題的上下文中得出的,但這不一定是顯而易見的,因此可能使對(duì)此問題的普通讀者感到困惑。
從UTF-8到本地編碼,我們必須研究如何實(shí)現(xiàn)“字符串”。某些語言(例如Python> = 3)將使用整數(shù)代碼點(diǎn)表示每個(gè)字符,這會(huì)導(dǎo)致每個(gè)字符4個(gè)字節(jié)= 32位,以覆蓋我們需要的unicode所需要的21位,但有些浪費(fèi)。為什么不完全是21位?因?yàn)樽止?jié)對(duì)齊時(shí)事情會(huì)更快。諸如Python <= 2和Java之類的某些語言使用UTF-16編碼表示字符,這意味著它們必須使用代理對(duì)來表示擴(kuò)展的Unicode(不是BMP)。無論哪種方式,最大長度仍為4個(gè)字節(jié)。
如果要使用UTF-8,請回答->本機(jī)編碼:4個(gè)字節(jié)
因此,最終結(jié)論4是最常見的正確答案,因此我們正確了。但是,里程可能會(huì)有所不同。

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
沒有分配超過10FFFF(剛好超過一百萬)限制的代碼點(diǎn),并且許多UTF8實(shí)現(xiàn)從未實(shí)現(xiàn)超過4個(gè)字節(jié)的序列(并且只有3個(gè),例如MySQL),所以我認(rèn)為將每個(gè)限制硬限制為4個(gè)字節(jié)是安全的即使考慮與較早實(shí)現(xiàn)的兼容性,也可以使用codepoint。您只需要確保在途中丟棄任何無效的東西即可。請注意,在可能的情況下,matiu建議在計(jì)算出精確的字節(jié)長度后進(jìn)行分配。
添加回答
舉報(bào)