背景:我有一个使用tinymce编辑HTML的网站。 HTML实体,如非破坏空间和& x22C4;正在通过tinymce转换为UTF-8字符,即使我使用的是entity_encoding:“named”选项。然后我将它存储在一个UTF-8的MySQL表中。当稍后检索相同的HTML以进行重新编辑时,通过tinymce将多字节字符分成单个字符。 Tinymce已经证实这是一个错误。
问题是:如何在不破坏HTML的情况下将所有多字节UTF-8字符转换为HTML实体?
我在PHP中尝试了以下内容,但只删除了多字节UTF-8字符:
$encoded_string = htmlentities( $utf_string, ENT_HTML5, 'UTF-8', false );
$html_ent_conv = htmlspecialchars_decode ( $encoded_string , ENT_COMPAT | ENT_HTML5 );
我也尝试了mb_encode_numericentity,但我无法弄清楚我应该用什么来表示convmap参数。
更新:我有PHP 5.3.17,它不支持ENT_HTML5,所以我删除了它。现在它适用于非中断空间,但不适用于其他多字节UTF-8字符。
答案 0 :(得分:0)
几年前,我在PHP文档中遇到了这段代码:
function utf8_to_html($data)
{
return preg_replace("/([\\xC0-\\xF7]{1,1}[\\x80-\\xBF]+)/e", '_utf8_to_html("\\1")', $data);
}
function _utf8_to_html($data)
{
$ret = 0;
foreach((str_split(strrev(chr((ord($data{0}) % 252 % 248 % 240 % 224 % 192) + 128) . substr($data, 1)))) as $k => $v)
$ret += (ord($v) % 128) * pow(64, $k);
return "&#$ret;";
}
走出去再找到它:
http://php.net/manual/en/function.utf8-decode.php
精彩的小片段在几次拯救了我的培根。