Сравнение строки UTF-8

Я пытаюсь сравнить две строки, можно сказать, Эмили и Зои. Ну 'E' доходит до 'Z', но на ASCII-диаграмме Z приходит до É, поэтому нормальный if ( str1 > str2 ) не будет работать.

Я пытался с if (strcmp(str1,str2) > 0) все еще не работает. Поэтому я ищу способ сравнения строк с символами UTF-8.

Solutions Collecting From Web of "Сравнение строки 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 }