Складывание / Нормализация лигатур (например, Æ в ae) с использованием (Core) Foundation

Я пишу помощник, который выполняет ряд преобразований во входной строке, чтобы создать удобное для поиска представление этой строки.

Подумайте о следующем сценарии:

  • Полнотекстовый поиск по текстам на немецком или французском языке
  • Записи в вашем хранилище данных содержат
    1. Мюллер
    2. Гросманн
    3. Тинглетон
    4. Бьёрк
    5. Эреограмма
  • Поиск должен быть нечетким, поскольку
    1. ull , Üll и т. Д. Соответствуют Müller
    2. Gros , groß и т. Д. Соответствуют Großmann
    3. cin ] и т. д. соответствует ingletòn
    4. bjö , bjo и т. д. соответствует Bjørk
    5. aereo и т. д. соответствует reogramme

Пока что, Я добился успеха в случаях (1), (3) и (4).

Я не могу понять, как обрабатывать (2) и (5).

До сих пор я пробовал следующие методы безрезультатно:

CFStringNormalize() // with all documented normalization forms
CFStringTransform() // using the kCFStringTransformToLatin, kCFStringTransformStripCombiningMarks, kCFStringTransformStripDiacritics
CFStringFold() // using kCFCompareNonliteral, kCFCompareWidthInsensitive, kCFCompareLocalized in a number of combinations -- aside: how on earth do I normalize simply _composing_ already decomposed strings??? as soon as I pack that in, my formerly passing tests fail, as well...

Я бегло просмотрел Руководство пользователя ICU для преобразований , но не вкладывал в него слишком много денег… для чего я думаю есть очевидные причины.

Я знаю, что могу уловить регистр (2), преобразовав его в верхний регистр, а затем обратно в нижний, что будет работать в рамках этого конкретного приложения. Тем не менее, я заинтересован в решении этой проблемы на более фундаментальном уровне, надеюсь, что он также позволит использовать чувствительные к регистру приложения.

Будем признательны за любые подсказки!

6
задан tc. 18 March 2013 в 18:14
поделиться