Wes*_*ley 3 html php utf-8 character-encoding
我有这个代码将数字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('’');
Run Code Online (Sandbox Code Playgroud)
html_entity_decode 已经做了你想要的:
$string = '’';
echo html_entity_decode($string, ENT_COMPAT, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)
它将返回角色:
’ binary hex: c292
Run Code Online (Sandbox Code Playgroud)
这是私人使用两个(U + 0092).由于它是私人使用,您的 PHP配置/版本/编译可能根本不会返回它.
还有一些更多的怪癖:
但在HTML(而不是XHTML,它使用XML规则等),这是一个长期的浏览器怪癖范围内的字符引用
€到Ÿ被误解为与字节128在Windows西方代码页(CP1252)相关联的159个字符,而不是带有这些代码点的Unicode字符.HTML5标准最终记录了这种行为.
见: 在轨道上的红宝石中被nokogiri转换为"\ u0092"
| 归档时间: |
|
| 查看次数: |
4810 次 |
| 最近记录: |