Странность сравнения строк в PHP - PullRequest
3 голосов
/ 08 сентября 2010

Я сравниваю строку из базы данных со списком строк в массиве:

if (in_array($entry, array('Söme string', 'other-string')))

Это работает для other-string, но не для Söme string, главное отличие состоит в том, что в этой строке есть умляут и сущность html. Если $entry равно Söme string в базе данных, сравнение не выполняется, даже если это должна быть та же строка.

Я также пытался strcmp и прямое сравнение, используя === и ==, но сравнение всегда отрицательно. Я также пытался utf8_encode перед сравнением, но это ничего не сделало.

База данных использует UTF-8, я получаю данные, используя функции Drupal API, и мой php-файл также имеет кодировку UTF-8. Если я выведу $entry и Söme string в выходной HTML, они будут неразличимы.

Есть идеи, что может быть причиной такого поведения?

Обновление

Спасибо за помощь. Кажется, что   конвертируется в пути и хранится как реальное неразрывное пространство в базе данных, а не как объект HTML. Печать его преобразует его обратно в сущность HTML (или, может быть, Firebug делает это, когда я смотрю на это).

Вывод var_dump () (с использованием функции печати, взятой из результирующего HTML-источника):

$entry: string(14) "Söme string"

"Söme string": string(18) "Söme string"

(я отредактировал строку, поскольку реальная содержит имя)

Обновление 2

Я изменил строку на "Some string" и вот вывод

var_dump(bin2hex($entry));
var_dump(bin2hex('Some string'));

$entry: string(24) "536f6d65c2a0737472696e67"
"Some string": string(32) "536f6d65266e6273703b737472696e67"

Ответы [ 2 ]

4 голосов
/ 08 сентября 2010

Тогда строки не совпадают.Возможно:

  • $entry содержит фактический пробел вместо неразрывного пробела.
  • Один имеет HTML-сущность  , а другой - фактический неразрывный пробел.
  • В одном из сценариев символ ö разлагается, а в другом - нет.

Попробуйте var_dump массив и $entry.

0 голосов
/ 08 сентября 2010

Проблема заключалась в том, что $entry содержал неразрывный пробел в кодировке UTF-8 (0xc2a0). Просто вызов html_entities для него не сработал, потому что я не указал кодировку. Поэтому мое решение следующее:

htmlentities($entry, ENT_QUOTES, 'UTF-8')
...