Посимвольная обработка строки

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

Если в случае с буквой с и c (латинская и кириллическая) и а/a можно методом ctrl+c, ctrl+f вычислить злосчастное слово, то с такими вещами, как обычный пробел и неразрывный пробел может быть дикое замешательство, что sublime text, что firefox нормально находил первую подстроку во второй, а вот php так не считал...

Для своих исследований я написал вот такую функцию на PHP

define('BR','<br>');

function str_pars($str)
{
	$len = mb_strlen($str);
	echo BR.$str.' (length='.$len.')'.BR;
	for ($i=0;$i<$len;$i++)
	{
		$char = mb_substr($str,$i,1);
		echo 'ch="'.$char.'"('.mb_ord($char).')'.BR;

	}

}

Это выведет посимвольно всю строку и для каждого символа покажет его код UTF, далее можете заглянуть вот сюда.

У меня во всех строках был пробел с кодом 32, а в одной из них 160.

Предварительно код нужно перевести в 16 ричную систему, т.е. 160 = A0, значит по первой колонке ищем U+00A0

Есть и более интересные варианты, когда Й выражается через И и сдвинутую надстрочную галочку ̆, (й) в UTF достаточно много интересных символов. И буква ё и много другого во входных данных может казаться схожим внешне, но разными символами.

Скопируйте символ й в блокнот, попробуйте удалить букву и получите удаление надстрочного....

На хабре есть статья по этой теме

Чтобы нормализовать пробелы и заменить двойные пробелы на одинарные, я использую вот такую конструкцию

$str = preg_replace('/\s{1,}/u', " ", $str);
Показать комментарии