Декодирование числовых html-объектов через PHP

У меня есть этот код для декодирования числовых объектов html эквивалентному символу UTF8.

Я пытаюсь преобразовать этот символ:

& # 146;

который должен выводить:

'

Однако он просто исчезает (нет выхода). (я проверил исходный код страницы, страница имеет правильные заголовки / мета-теги символов utf8).

Кто-нибудь знает, что не так с кодом?

function entity_decode($string, $quote_style = ENT_COMPAT, $charset = "UTF-8") { $string = html_entity_decode($string, $quote_style, $charset); $string = preg_replace_callback('~&#x([0-9a-fA-F]+);~i', "chr_utf8_callback", $string); $string = preg_replace('~&#([0-9]+);~e', 'chr_utf8("\\1")', $string); //this is another method, which also doesn't work.. //$string = preg_replace_callback("/(\&#[0-9]+;)/", "entity_decode_callback", $string); return $string; } function chr_utf8_callback($matches) { return chr_utf8(hexdec($matches[1])); } function chr_utf8($num) { if ($num < 128) return chr($num); if ($num < 2048) return chr(($num >> 6) + 192) . chr(($num & 63) + 128); if ($num < 65536) return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128); if ($num < 2097152) return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128); return ''; } function entity_decode_callback($m) { return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES"); } echo '=' . entity_decode('’'); 

html_entity_decode уже делает то, что вы ищете:

 $string = '&#146;'; echo html_entity_decode($string, ENT_COMPAT, 'UTF-8'); 

Он вернет символ:

 ' binary hex: c292 

Это ЧАСТНОЕ ИСПОЛЬЗОВАНИЕ ДВА (U + 0092) . Поскольку это частное использование, ваша конфигурация / версия / компиляция PHP может вообще не возвращать ее.

Также есть еще несколько причуд:

Но в HTML (отличном от XHTML, который использует XML-правила), это давний браузерный подход, который ссылается на символы в диапазоне &#128; to &#159; неверно интерпретируются как означающие символы, связанные с байтами от 128 до 159 на кодовой странице Windows Western (cp1252), а не символы Юникода с этими кодовыми точками. Стандарт HTML5, наконец, документирует это поведение.

См.: & # 146; преобразуется как «\ u0092» от nokogiri в рубине на рельсах