2

背景:我有一个使用 tinymce 编辑 HTML 的网站。HTML 实体,如不间断空格和 &x22C4; 即使我使用的是 entity_encoding:"named" 选项,tinymce 也会将其转换为 UTF-8 字符。然后我将它存储在一个 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 字符。

4

1 回答 1

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

绝妙的小片段,有几次救了我的培根。

于 2013-07-14T20:28:16.523 回答