2012-03-06 2 views
3

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

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

& # 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('&#146;'); 

ответ

5

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

$string = '&#146;'; 

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

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

’ binary hex: c292 

Что PRIVATE USE TWO (U+0092). Поскольку это личное использование, ваш Конфигурация PHP/версия/компиляция может вообще не возвращать его.

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

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

См: &#146; is getting converted as “\u0092” by nokogiri in ruby on rails

+1

Пробовал только с html_entity_decode, но это не работает, он возвращает пустой, как хорошо. Не уверен, что вы говорите о пространстве, в моем коде нет места? Я также попытался удалить html_entity_decode или поместив его в качестве последнего для выполнения, но без помощи. Спасибо. – Wesley

+0

@Wesley: В зависимости от вашей версии PHP 'html_entity_decode' возвращает что-то. Однако я продлил ответ, который может пролить немного света. – hakre

+0

Также этот [ответ на «Преобразовать (doublebyte) строку в Hex»] (http://stackoverflow.com/a/7015137/367456) может оказаться полезным. – hakre

Смежные вопросы