2

背景: tinymce を使用して HTML を編集する Web サイトを持っています。改行なしスペースや &x22C4; などの HTML エンティティ。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 パラメーターに何を使用すればよいかわかりませんでした。

更新: ENT_HTML5 をサポートしていない PHP 5.3.17 を使用しているため、削除しました。現在は非改行スペースでは機能しますが、他のマルチバイト 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 に答える