Декодирование HTML-объекта в php не работает должным образом [duplicate]

Если вы получаете это сообщение во время сохранения или компиляции сборки, просто закройте все файлы, а затем откройте любой файл для компиляции и сохранения.

Для меня причина в том, что я переименовал файл, и старый файл все еще был открыт.

3
задан Abs 21 August 2011 в 12:41
поделиться

1 ответ

Проблема заключается в том, что ’ декодирует символ 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, даже не по ссылке, поэтому ™, например, не допускается , Однако для обратной совместимости с ранними авторами 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);
}
10
ответ дан deceze 5 September 2018 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: