tinymce utf8 bug的解决方法

时间:2013-03-26 22:06:13

标签: php tinymce

背景:我有一个使用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字符。

1 个答案:

答案 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

精彩的小片段在几次拯救了我的培根。

相关问题