Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Все эти проверки проверяют лишь может ли строка быть в UTF-8 или нет.А большего и не надо. Если клиент сказал что текст будет в UTF-8, а прислал нечто в windows-1251, которое выглядит как UTF-8 — то он ССЗБ (сам себе злобный Буратина).
PS: прошу пример поломаных дровВнизу — пример очевидный и довольно серъёзный, но уже не очень актуальный. Другой пример — спамфильтры. Вы можете использовать хитрые символы в URL, а невалидный UTF-8 обломает вам всю нормализацию. При этом вырезание лишнего (скажем тега <script>) склеит вам пресловутую точку (она из нескольких байт в UTF-8 состоит) и она «возродится из пепла». Да, можно на каждом шаге при обработке текста думать «а не создались ли у нас тут новые хитрые юникодные симвлы после того, как мы что вырезали/заменили/etc), а можно — убедиться что у нас на входе UTF-8 и больше уже об этом не задумываться. Кроме проверки UTF-8 на валидность хорошо бы ещё нормализацию провести — но это уже от конкретных алгоритмов зависит. Нормализация — штука медленная, сложная и неоднозначная, проверка UTF-8 на валидность — вещь быстрая и простая (особенно если через PCRE делать).
Эта проблема применима и к другим кодировкам, например: <<script>iframe… >Только к мультибайтовым. Когда вы удаляете из <<script>iframe… > <script> там не появляется новых символов (code points). Новые подстроки — да, появляются и за этим нужно сделать. Но новые символы — нет. В испорченной многобайтовой кодировке могут появляться новые символы — и это совсем другая проблема. Собственно корейцы там не только UTF-8 на валидность проверяют.
Если я предполагаю, что строка — UTF-8 то возродившиеся символы — будут рассмотрены в новой итерации вполне корректно.У вас программа интерактивно по очереди вырезает сначала лишние теги, потом spam, потом снова теги, потом снова spam и так — пока процесс не сойдётся к чему-нибудь? Тоже вариант, конечно. Но доказать корректность этой деятельности куда сложнее, чем просто предварительно убедиться что у вас данные — не испорчены.
пока процесс не сойдётся к чему-нибудь?
function is_utf8($string) {
for ($i=0; $i<strlen($string); $i++) {
if (ord($string[$i]) < 0x80) continue;
elseif ((ord($string[$i]) & 0xE0) == 0xC0) $n=1;
elseif ((ord($string[$i]) & 0xF0) == 0xE0) $n=2;
elseif ((ord($string[$i]) & 0xF8) == 0xF0) $n=3;
elseif ((ord($string[$i]) & 0xFC) == 0xF8) $n=4;
elseif ((ord($string[$i]) & 0xFE) == 0xFC) $n=5;
else return false;
for ($j=0; $j<$n; $j++) {
if ((++$i == strlen($string)) || ((ord($string[$i]) & 0xC0) != 0x80))
return false;
}
}
return true;
}
Строка в UTF-8?