2010-10-25 462 views
2

我在寫一個C程序來搜索數據庫中的大量UTF-8字符串。其中一些字符串包含教學法的英文字符,如重音符號等。搜索字符串由用戶輸入,因此它很可能不包含這些字符。有沒有一種方法(函數,庫等)可以從字符串中刪除這些字符,或者只是執行一個教學不敏感的搜索?例如,如果用戶輸入搜索字符串「motor」,它應該匹配字符串「moto ̈ rhead」。從C中的UTF8字符串中刪除變音符號

我第一次嘗試是手工剝離出這裏所描述的結合教學修飾符:

http://en.wikipedia.org/wiki/Combining_character

這個工作在某些情況下,但事實證明,許多這些字符也有特定的Unicode值。例如,上面的字符「o ̈」可以用一個「o」表示,然後是組合教學U + 0308,但它也可以用單個Unicode字符U + 00F6表示,而我的方法只能過濾前者。

我也看過iconv,它可以從UTF8轉換爲ASCII。但是,我可能希望將來的日期本地化我的程序,這無疑會導致非英文字符的語言出現問題。有沒有一種方法可以簡單地去掉/轉換這些重音字符?

編輯:刪除問題標題中的錯字。

+0

你可能是指* diacritics * http://en.wikipedia.org/wiki/Diacritic不*教學法*? – kriss 2010-10-25 15:04:51

+0

這是一個教學評論。 – 2010-10-25 15:07:37

+0

每個人都需要學習有時... – kriss 2010-10-25 15:09:36

回答

4

轉換爲one of the decomposed normalizations - 可能是NFD,但你可能想要NFKD - 這會使所有的變音符合併成可以被剝離的字符。

你會想要一個這樣的圖書館。我聽到有關ICU的好消息。

1

使用ICU,在PRIMARY(L1)(僅使用基本字母,只關心'o'並忽略'ö')強度的「root」上創建collactor,然後您可以使用ICU的搜索功能進行匹配。有一個新的功能search collator,將提供專門爲這種情況設計的校正器,但「主要優勢」將處理這個特定情況。例如:"motor == mötor" in the 'collated' section