У меня есть база данных, которая содержит неанглийские слова (для тех, кто интересуется турецкими буквами). И у меня есть алгоритм, который сравнивает ввод с базой данных.

Итак, моя проблема в следующем; в моей базе данных все строки написаны турецкими символами. Допустим, у меня есть этот элемент для сравнения heyyö. Когда пользователь вводит heyyo, он не найдет его, поскольку они считаются разными словами.

Моей первой мыслью были особые случаи, и когда был найден неанглийский символ, подумайте, будет ли английская или неанглийская буква (например, g с ğ или i с ı), но это означает много грубой силы.

Как я могу сделать это с элегантностью.

Да, и пользователь вводит эти данные из текстового поля, если это не подразумевается.

2
judge 14 Май 2014 в 01:34

2 ответа

Лучший ответ

Удаление диакритических знаков называется «сворачиванием». Вы можете сравнивать строки без учета диакритических знаков, используя опцию NSDiacriticInsensitiveSearch.

[string compare:otherString options:NSDiacriticInsensitiveSearch] == NSOrderedSame

Аналогичным образом вы можете создать свернутую строку, используя stringByFoldingWithOptions:locale:.

Обратите внимание, что при этом удаляются только диакритические знаки. Есть много способов, которыми персонажи могут «казаться» одинаковыми, но не быть одинаковыми. Турецкий язык несколько печально известен по этому поводу, потому что строчная версия «I» - это «ı» (ЛАТИНСКАЯ СТРОЧНАЯ ТОЧКА I), а не «i». Если вы особенно имеете дело с турецким языком, возможно, вам придется это учитывать.

3
Rob Napier 14 Май 2014 в 14:11

Вы можете сделать что-то вроде этого:

NSString *input = @"heyyö";
NSData *intermediaryDataForm = [input dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *output = [[NSString alloc] initWithData:intermediaryDataForm encoding:NSASCIIStringEncoding];

Таким образом, поскольку турецкие буквы не являются частью ASCII, и вы разрешаете преобразование с потерями, он автоматически меняет «ö» на «o» при преобразовании в форму NSData. Затем преобразование его обратно в NSString решает проблему.

0
Yarneo 13 Май 2014 в 21:40