2014-06-19 107 views
0

如何從UTF-8編碼字符串中刪除重音符號?有數百個答案要麼使用某些庫函數,要麼使用轉換表。UTF-8編碼字符串的字符串長度

我正在尋找實際的算法(背後的想法和它爲什麼工作),而不是一個準備好使用的實現。

我的目標是計算一個UTF-8編碼的字符串單個字符(這樣,例如,utf8_strlen("Vypočítávání") = 12。我想算長度的任何字符串,包括中國或者克林貢語。

我已經知道怎麼算多字節字符:如果當前字節的最高位爲1,那麼我就知道一些更多的字節將出席放眼未來幾個字節,我可以告訴大家的是:

  • 110xxxxx意味着多了一個字節將會跟着,
  • 1110xxxx另外兩個,
  • 11110xxx三。

(我們可以假設,該字符串正確編碼,即序列是一個有效的UTF-8流。這意味着,這些字節實際上將遵循

我讀一個字節我知道有多少人會指定一個Unicode代碼點,因此我可以跳過這些(再次,流有效)並相應地增加中間和。

我該如何做相同的字符組合?也就是說,有一個簡單的方法來告訴代碼點是否例如(如HACEKčç在中國任何奇怪的曲線加符)口音? 如果有,那麼我也期待跳過它們。

非常感謝!

+1

是的,有一種簡單的方法可以做到這一點。不幸的是,這種直接的方式不是一種算法,而是在作爲Unicode標準一部分的大型數據表中查找表格。他們爲每個代碼點指定各種屬性,包括您之後的代碼。 – jalf

+0

目前還不清楚你在問什麼。標題與問題的內容不匹配。這個問題似乎意味着口音是通過結合字符呈現的,在大多數情況下,它們不是。處理字節在這裏真的不相關。它在概念上和編程上處於完全不同的水平。你還沒有定義一個字符串的長度。 –

回答

2

您必須將UTF-8序列實際解碼爲Unicode碼位(即將UTF-8轉換爲UTF-32),然後您可以根據需要操作碼位,然後將其餘碼位重新編碼回UTF- 8如果需要。

由於您已經知道如何解析每個UTF-8八位字節來檢測每個序列的字節數,只需取每個完整的1-4字節序列,將其餘位解析爲32位值,然後在Unicode圖表中查找該值知道它是重音,變音符號還是其他組合字符,然後採取相應措施。您還應該對解碼後的碼值進行標準化,以使組合字符更易於檢測或跳過。

2

要做到這一點,你必須閱讀TR29(UNICODE TEXT SEGMENTATION),分割成「字形集羣」,然後計算集羣的數量。

+0

+1有關更詳細的答案(具有相同的結論),請參閱[*** JavaScript有一個Unicode問題***](http://mathiasbynens.be/notes/javascript-unicode#counting-symbols)。 (它使用JavaScript作爲示例,但大多數底層技術都是Unicode特定的,適用於任何編程語言。) –