通过PHP解码数字html实体

时间:2012-03-06 16:26:02

标签: php html utf-8 character-encoding

我有这个代码将数字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('&#146;');

1 个答案:

答案 0 :(得分: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(使用XML规则的XHTML除外)中,这是一个长期存在的浏览器怪癖,&#128;&#159;范围内的字符引用被误解为与字节相关的字符在Windows Western代码页(cp1252)中使用128到159而不是带有这些代码点的Unicode字符。 HTML5标准最终记录了这种行为。

请参阅:&#146; is getting converted as “\u0092” by nokogiri in ruby on rails