Удаление диакритических символов из строки UTF8 в C - PullRequest
2 голосов
/ 25 октября 2010

Я пишу программу на C для поиска большого количества строк UTF-8 в базе данных. Некоторые из этих строк содержат английские символы с дидактикой, например, ударения и т. Д. Строка поиска вводится пользователем, поэтому, скорее всего, она не будет содержать такие символы. Есть ли способ (функция, библиотека и т. Д.), Который может удалить эти символы из строки или просто выполнить нечувствительный к дидактике поиск? Например, если пользователь вводит строку поиска «motor», она должна соответствовать строке «motörhead».

Моей первой попыткой было вручную исключить описанные здесь дидактические модификаторы:

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

В некоторых случаях это работало, но оказалось, что многие из этих символов также имеют определенные значения Unicode. Например, символ «ö» выше может быть представлен как «o», за которым следует дидактическое объединение U + 0308, но он также может быть представлен одним символом юникода U + 00F6, а мой метод фильтрует только первый.

Я также посмотрел на iconv, который может конвертировать из UTF8 в ASCII. Однако я могу захотеть локализовать свою программу в будущем, и это, несомненно, вызовет проблемы для языков с неанглийскими символами. Есть ли способ, которым я могу просто раздеть / преобразовать эти акцентированные символы?

Редактировать: удалена опечатка в заголовке вопроса.

Ответы [ 2 ]

4 голосов
/ 25 октября 2010

Преобразовать в одну из разложенных нормализаций - возможно, NFD, но вам может понадобиться даже NFKD - которая превращает все диакритические знаки в объединяющие символы, которые можно удалить.

Вам понадобится библиотека для этого. Я слышу хорошие вещи о ICU .

1 голос
/ 25 октября 2010

Используйте ICU , создайте разборщик над «корнем» с силой PRIMARY (L1) (которая использует только базовые буквы, заботится только о «o» и игнорирует «ö»), затем вы можете использовать ICU функции поиска, чтобы соответствовать. Появилась новая функциональность поисковый коллатер , который будет обеспечивать специальные коллатера, разработанные для этого случая, но «первичная сила» будет обрабатывать этот конкретный случай.

Пример: "motor == mötor" в разделе "разбор" .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...