Сравнение двух строк Юникода в PHP - PullRequest
3 голосов
/ 28 июля 2011

Я застрял в сравнении двух строк Unicode в PHP, которые содержат специальный символ 'ö'. Одна строка взята из $_GET, другая - это имя папки файловой системы (scandir()). Обе строки кажутся мне равными, что делает

var_dump($filter);
var_dump($tail . '/' . $k);

на них также показывает их равенство, но с различными длинами строки (?!):

string '/blöb' (length=7)
string '/blöb' (length=6)

Мой фрагмент, сравнивающий их, выглядит следующим образом:

if($filter == ($tail . '/' . $k)) {
    /* ... */
}

Что здесь происходит?

Дополнительная информация: $tail - пустая строка:

string '' (length=0)

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Смотрите здесь: http://en.wikipedia.org/wiki/Unicode_equivalence и используйте это: http://www.php.net/manual/en/class.normalizer.php

Возможно, у вас есть разложенный символ в более длинной строке, означающий o, а затем комбинирующий символ умлаут, который перекрывает предыдущий символ.

Функция нормализатора исправит подобные вещи.

В качестве примечания вы всегда должны нормализовать ввод, если вы используете его для эквивалентности (например, имя пользователя - вы хотите убедиться, что два человека не выбирают одно и то же имя пользователя, даже если происходит двоичное представление строки быть другим).

0 голосов
/ 28 июля 2011

Можете ли вы попробовать проанализировать их через utf8_encode () и проверить их там?PHP не поддерживает Юникод и поэтому рекомендует использовать utf8_encode / decode для некоторых основных функций Юникода.

http://php.net/manual/en/language.types.string.php

...