2010-02-23 57 views
9

如果我有一個包含UTF8內容的字節數組,我將如何解析它?是否有分隔字節,我可以拆分得到每個字符?是否有用於UTF8字符的分隔符字節?

+0

要小心格式錯誤的輸入,例如,如果序列超過4個字節,請確保您的代碼不會像緩衝區溢出那樣做不好的事情。 – 2010-02-23 23:37:45

+0

完成必要的拾取操作後,最終會產生一串長度爲1到4個字節的字符;你打算怎麼做?你爲什麼不解碼並處理所產生的Unicode字符? – 2010-03-08 01:49:11

+0

@JohnMachin在我的案例中,「字符串」太大而無法一次處理,我的代碼搜索安全的字節偏移量以將數據分割爲可以單獨處理的較小塊。 – 2016-07-26 04:01:15

回答

13

採取這裏看看......

http://en.wikipedia.org/wiki/UTF-8

如果你正在尋找識別字符之間的邊界,你需要的是在「說明」中的表。

獲得高位爲零的唯一方法是ASCII子集0..127,以單個字節編碼。所有的非ASCII代碼點都有第二個字節,最高兩位爲「10」。代碼點的前導字節從來沒有 - 高位指示字節數,但有一些冗餘 - 您可以同樣觀察下一個沒有「10」的字節來指示下一個代碼點。

0xxxxxxx : ASCII 
10xxxxxx : 2nd, 3rd or 4th byte of code 
11xxxxxx : 1st byte of code, further high bits indicating number of bytes 

unicode中的代碼點不一定與某個字符相同。例如,有修飾符碼點(如口音)。

+0

表情符號變異序列怎麼樣?例如,如果字符'U + 1F469'(在二進制文件'11110000 10011111 10010001 10101001'中)是它自己的,那麼你會得到「女人」表情符號。但如果它後面跟着'U + 1F3FD'(二進制'11110000 10011111 10001111 10111101'),那麼它將是一個棕色皮膚的女人。你怎麼能安全地檢測到這個邊界以避免破壞兩者之間的utf-8字節?兩個代碼點都是有效的(後者在OS X上呈現爲棕色方塊),但用戶不會期望它們被分割。 – 2016-07-26 03:55:38

+0

@AbhiBeckert - 你在錯誤的層面上思考。 UTF-8沒有定義或關心Unicode代碼點的序列是如何相互關聯的。首先,您將UTF-8(或其他編碼)轉換爲Unicode碼流,然後解釋它。我不知道Unicode特定的細節,但處理修飾符代碼點問題的一般方法與識別編程語言標記器中的關鍵字和其他標記相同。可能有更好的Unicode方式,但我不知道,無論如何,你應該問一個單獨的問題。 – Steve314 2016-07-26 04:53:29

+0

我試圖找出「字符之間的界限」,其中「字符」是一個單一的字形被繪製到屏幕上,這正是您正在回答的問題,據我所知。我將大量(可能是千兆字節)數量的utf-8數據分成單獨繪製到屏幕上的較小塊(數十個字節),如果字節按照您在您的建議中分開的方式分開回答。 – 2016-07-26 04:57:13

0

第一位設置爲0的字節是普通的ASCII字符。首位設置爲1的字節是UTF-8字符的一部分。

每個UTF-8字符中的第一個字節的第二位設置爲1,因此該字節的最高有效位爲11。每個屬於同一個UTF-8字符的後續字節都以10開頭。

每個UTF-8字符的第一個字節還指出以下幾個字節屬於該字符的數量,具體取決於在該字節的最高有效位中設置爲1的位數。

有關更多詳細信息,請參閱針對UTF-8的Wikipedia page

+0

「UTF-8字符」是一個用詞不當。您似乎指的是代表非ASCII字符的兩到四個字節的序列。談到理解Unicode時,我認爲讓詞彙正確是戰鬥的一半。 – 2010-02-24 15:26:05