Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Сравнение двух строк юникода в PHP

Автор вопроса: proximusОтветов: 2

Я застрял в сравнении двух строк 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)
  • Что возвращает print_r(unpack("H*",$k)) в ваших двух случаях? Anders Lindahl 28.07.2011
  • Помните, что некоторые файловые системы используют NFD (или близкие к нему), и вы, вероятно, имеете в виду NFC. Вам нужно нормализовать одно и то же, если вы хотите выполнить двоичное сравнение. Но делать бинарные сравнения с текстом не рекомендуется. Вам нужно использовать UCA для текстовых сравнений. См. мой выступление OSCON на семи языках по Unicode на прошлой неделе. tchrist 30.07.2011

phpstringunicodeutf-8compare

Ответы

Ответ 1 · рейтинг 3 · Ariel

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

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

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

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

Ответ 2 · рейтинг -1 · Florian Margaine

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы