Проблема со сравнением строк в PHP - PullRequest
4 голосов
/ 04 января 2011

У меня есть две строки с, казалось бы, одинаковыми значениями. Один хранится в виде ключа в массиве, другой - в другом массиве. Я сравниваю их, используя ==, === и strcmp. Все относятся к ним как к разным строкам. Я делаю var_dump, и это то, что я получаю.

string(17) "Valentine’s Day" 
string(15) "Valentine's Day"

Кто-нибудь знает, почему первая строка будет 17 символов, а вторая 15?

Обновление: это немного более очевидно, когда я вставил это из моего редактора, шрифт которого сделал два разных апострофа почти неразличимыми.

Ответы [ 3 ]

8 голосов
/ 04 января 2011

Первая строка содержит символ Unicode для апострофа, в то время как вторая строка имеет обычный символ ASCII '.

Символ Unicode занимает больше места.

Если вы запустите функцию PHP ord() для каждого из этих символов, вы увидите, что вы получаете разные значения для каждого из них:

echo ord("’"); //226 This is just the first 2 bytes (see comments below for details from ircmaxell)
echo ord("'"); //27
1 голос
/ 04 января 2011

В качестве дополнения к ответу @Mark выше, который является правильным ( является многобайтовым символом, скорее всего, UTF-8, а ' - нет). Вы можете легко преобразовать его в ASCII (или ISO-8859-1), используя iconv , например:

echo iconv('utf-8', 'ascii//TRANSLIT', $str);

Примечание: Не все символы могут быть преобразованы из многобайтового в ASCII или латинский1. Вы можете использовать //IGNORE, чтобы удалить их из результирующей строки.

0 голосов
/ 04 января 2011

'! ='

в основном.если вы хотите, чтобы это не было проблемой, вы можете сделать что-то вроде этого.

if (str_replace ('' ',' \ '', "Valentine's Day") == "День святого Валентина") {

...