Декодирование числовых HTML-сущностей через PHP - PullRequest
3 голосов
/ 06 марта 2012

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

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

'

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

'

Однако, он просто исчезает (без вывода).(Я проверил исходный код страницы, на странице указаны правильные заголовки / метатеги набора символов 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('&#146;');

1 Ответ

5 голосов
/ 06 марта 2012

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

$string = '&#146;';

echo html_entity_decode($string, ENT_COMPAT, 'UTF-8');

Будет возвращен символ:

’   binary hex: c292

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

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

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

См .: ’превращается в« \ u0092 »nokogiri в ruby ​​на рельсах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...