Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

ВАЖНО

Этот ответ предназначен для ситуаций, когда невозможно запустить/установить расширение '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 
// )

Ответ 2

Не существует собственного способа сделать это, однако расширение PECL: http://php.net/manual/de/class.collator.php

$c = new Collator('fr_FR');
if ($c->compare('Émily', 'Zoey') < 0) { echo 'Émily < Zoey'; }

Ответ 3

Здесь что-то работает для меня, хотя я не уверен, будет ли он служить для сравнения специальных символов, которые есть у других языков.

Я просто использую функцию mb_strpos и просматриваю результаты. Я предполагаю, что это будет так близко, как вы можете получить нативное сравнение строк UTF8:

if (mb_strpos(mb_strtolower($search_in), $search_for) !== false) {
    //do stuff
}