HTMLでは「あいうえお」という文字列を「あいうえお」というように数値で表すことができる。 これを数値文字参照という。

日本語文字列を数値文字参照に変換したり、逆に数値文字参照を文字に変換する場合、自力で実装しようとすると、文字エンコードを調べ全ての文字を対応する値に変換するというかなりめんどうな処理を書くことになる。


文字と数値文字参照の相互変換を調べるとmb_encode_numericentity関数mb_encode_numericentity関数が見つかるが、これは$convmapという値の変換表を自分で用意しなければならないため、これでもかなりめんどくさい。

string mb_encode_numericentity ( string $str , array $convmap [, string $encoding ] )
string mb_decode_numericentity ( string $str , array $convmap [, string $encoding ] )

日本語文字列と数値文字参照の相互変換にはmb_convert_encoding関数を使うととても簡単だ。 mb_convert_encoding関数は、EUC-JPからUTF-8というように文字エンコードを変換するための関数だが、'HTML-ENTITIES'を指定することで数値文字参照との相互変換をすることもできる。

<?php
$str = <<<EOD
只今、プログラミング中・・・
EOD;

$str = mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8');
echo $str;
?>
&#21482;&#20170;&#12289;&#12503;&#12525;&#12464;&#12521;&#12511;&#12531;&#12464;&#20013;&#12539;&#12539;&#12539;

mb_convert_encoding関数による変換ではASCII文字は変換されないため、以下のようにタグを残して変換することもできる。

<?php
$html = <<<EOD
<html>
	<title>只今、プログラミング中・・・</title>
	<body>
		now programming ...
	</body>
</html>
EOD;

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
echo $html;
?>
<html>
	<title>&#21482;&#20170;&#12289;&#12503;&#12525;&#12464;&#12521;&#12511;&#12531;&#12464;&#20013;&#12539;&#12539;&#12539;</title>
	<body>
		now programming ...
	</body>
</html>

同じように、数値文字参照から文字列にすることもできる。

<?php
$str = <<<EOD
&#21482;&#20170;&#12289;&#12503;&#12525;&#12464;&#12521;&#12511;&#12531;&#12464;&#20013;&#12539;&#12539;&#12539;
EOD;

$str = mb_convert_encoding($str, 'UTF-8', 'HTML-ENTITIES');
echo $str;
?>
只今、プログラミング中・・・

ただし、数値文字参照から文字列に変換するときには、文字実体参照も文字列に変換されてしまうことに注意。

<?php
$html = <<<EOD
&#21482;&#20170;&#12289;&lt;b&gt;&#12503;&#12525;&#12464;&#12521;&#12511;&#12531;&#12464;&lt;/b&gt;&#20013;&#12539;&#12539;&#12539;
EOD;

$html = mb_convert_encoding($html, 'UTF-8', 'HTML-ENTITIES');
echo $html;
?>
只今、<b>プログラミング</b>中・・・