Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.
Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.
Проблема заключается в том, что ’
декодирует символ Unicode U + 0092, UTF-8 C2 92
, известный как ЧАСТНОЕ ИСПОЛЬЗОВАНИЕ ДВА:
$ php test.php | xxd
0000000: 5374 616e c292 73 Stan..s
Т.е., это не декодируется обычный апостроф.
html_entity_decode($string)
работает, потому что он фактически не декодирует объект, поскольку целевая кодировка по умолчанию - латинская-1, которая не может представлять этот символ. Если вы указываете UTF-8 как целевую кодировку, объект фактически декодируется.
Целью этого объекта является кодировка Windows-1252:
echo iconv('cp1252', 'UTF-8', html_entity_decode('Stan’s', ENT_QUOTES, 'cp1252'));
Stan’s
Цитирование Wikipedia :
Числовые ссылки всегда относятся к кодовым точкам Unicode, независимо от кодировки страницы. Запрещается использование числовых ссылок, которые ссылаются на постоянно неопределенные символы и управляющие символы, за исключением символов перевода строки, табуляции и возврата каретки. То есть символы в шестнадцатеричных диапазонах 00-08, 0B-0C, 0E-1F, 7F и 80-9F не могут использоваться в документе HTML, даже не по ссылке, поэтому
blockquote>™
, например, не допускается , Однако для обратной совместимости с ранними авторами HTML и браузерами, которые игнорировали это ограничение, необработанные символы и числовые ссылки на символы в диапазоне 80-9F интерпретируются некоторыми браузерами как представляющие символы, сопоставленные байтам 80-9F в кодировке Windows-1252.Итак, вы имеете дело с устаревшими объектами HTML здесь, что, по-видимому, PHP не работает так же, как это делают «некоторые» браузеры. Вы можете проверить, находятся ли декодированные объекты в указанном выше диапазоне, что вы перекодируете / сокращаете их в Windows-1252, а затем конвертируете в UTF-8. Или попросите своих пользователей передать действительный HTML.
Эта функция должна обрабатывать как устаревшие, так и обычные объекты HTML:
function legacy_html_entity_decode($str, $quotes = ENT_QUOTES, $charset = 'UTF-8') { return preg_replace_callback('/&#(\d+);/', function ($m) use ($quotes, $charset) { if (0x80 <= $m[1] && $m[1] <= 0x9F) { return iconv('cp1252', $charset, html_entity_decode($m[0], $quotes, 'cp1252')); } return html_entity_decode($m[0], $quotes, $charset); }, $str); }