数値文字参照と日本語文字列の相互変換をする【PHP】

  • 2020.03.08
  • PHP
数値文字参照と日本語文字列の相互変換をする【PHP】

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

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

Advertisement

文字と数値文字参照の相互変換を調べると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’を指定することで数値文字参照との相互変換をすることもできる。

‘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>中・・・
Advertisement