Я пытаюсь сравнить две строки, можно сказать, Эмили и Зои. Ну 'E' доходит до 'Z', но на ASCII-диаграмме Z приходит до É, поэтому нормальный if ( str1 > str2 )
не будет работать.
Я пытался с if (strcmp(str1,str2) > 0)
все еще не работает. Поэтому я ищу способ сравнения строк с символами UTF-8.
ВАЖНЫЙ
Этот ответ предназначен для ситуаций, когда невозможно запустить / установить расширение 'intl', и только сортирует строки, заменяя акцентированные символы на символы без акцента . Для сортировки акцентированных символов в соответствии с определенной локалью использование Collator – лучший подход – для получения дополнительной информации см. Другой ответ на этот вопрос.
Сортировка с помощью символов без акцента в PHP 5.2
Вы можете попробовать преобразовать обе строки в ASCII с помощью кнопок iconv () и // TRANSLIT, чтобы избавиться от акцентированных символов;
$str1 = iconv('utf-8', 'ascii//TRANSLIT', $str1);
Затем сделайте сравнение
Смотрите документацию здесь:
http://www.php.net/manual/en/function.iconv.php
[обновлено, в ответ на замечание @ Esailija] Я упустил из виду проблему // TRANSLIT, переводящей акцентированные персонажи неожиданными способами. Эта проблема упоминается в этом вопросе: php iconv translit для удаления акцентов: не работает как исключено?
Чтобы сделать подход «iconv ()», я добавил пример кода ниже, который разбивает все символы без слов из результирующей строки, используя preg_replace ().
<?php setLocale(LC_ALL, 'fr_FR'); $names = array( 'Zoey and another (word) ', 'Émilie and another word', 'Amber', ); $converted = array(); foreach($names as $name) { $converted[] = preg_replace('#[^\w\s]+#', '', iconv('UTF-8', 'ASCII//TRANSLIT', $name)); } sort($converted); echo '<pre>'; print_r($converted); // Array // ( // [0] => Amber // [1] => Emilie and another word // [2] => Zoey and another word // )
Для этого нет собственного способа, но расширение PECL: http://php.net/manual/de/class.collator.php
$c = new Collator('fr_FR'); if ($c->compare('Émily', 'Zoey') < 0) { echo 'Émily < Zoey'; }
Вот что-то, что работает для меня, хотя я не уверен, что он будет служить для сравнения специальных символов, которые есть у других языков.
Я просто использую функцию mb_strpos
и просматриваю результаты. Я предполагаю, что это будет так близко, как вы можете получить нативное сравнение строк UTF8:
if (mb_strpos(mb_strtolower($search_in), $search_for) !== false) { //do stuff }