おすすめ記事ピックアップ
PHPの「htmlspecialchars」、「mb_convert_encoding」、「mb_encode_numericentity」の文字参照化、エンティティ処理、各方法の違いをまとめてみました。
PHPで特殊文字を含むすべての文字を文字参照「&#数字;」等に変換するツールを作ろうとして、特殊文字、特殊記号、文字参照、文字実体参照、数値文字参照、エンティティ、エンコードとデコードなどで悩みました。名称が似ており、何が何のことを示しているのか、理解に苦しみました。調べて理解したことをまとめます。
エンティティ「 entity 」は実体という意味で、例えば文字「あいうえお」をエンティティすると、その実体であるデータの集合の文字参照「&#数字;」になります。エンコードは変換することで、デコードは戻すことです。
HTMLエンティティ、文字エンティティ、数字エンティティなど、良く使われていますが、明確な定義は無いように見えます。雰囲気でHTMLエンティティだったら、<>"などHTMLの特殊文字を示しているような感じです。違うかもしれませんが良く分からず。
特殊文字や特殊記号が、ブラウザーや端末でうまく使用できない時などに利用されたりします。「&#数字;」と入力して、画面やブラウザーを通すと、対応した文字や数字で表示されます。
文字や数字(特殊文字や特殊記号)を置き換えるコードは、いろんなパターンがあります。ここが理解できず悩みました。まず「実体参照」と「文字参照」の2種類があります。
「実体参照」とは、「>」を「>」と表示します。
「文字参照」とは、「>」を「>」と表示します。
そして「文字参照」はさらに、「10進数」と「16進数」があります。
「10進数」は、「>」を「>」と表示します。
「16進数」は、「>」を「>」と表示します。
これらはどれが正しいというものではなく、使いやすいように利用するようです。実体参照は、見た目でどの記号が理解しやすいため、良く利用されているようです。
ダブルクォーテーション「"」や「'」もエンティティ、実体参照化したい時は、「ENT_QUOTES」を使います。HTMLで利用するなら、「<>&"'」を実体参照化できれば、十分なので「htmlspecialchars」が使われています。
下記に参考コードです。textareaで実体参照を表示させています。HTMLで表示すると通常の文字で表示されてしまうからです。
下記に参考コードです。
2番目の引数で変換するコード領域を指定して、一括で変換できます。$convmapという変数名が使われるようです。わかりやすいので、そうしています。3番目には、文字エンコーディングを指定します。これだけで、すべて文字参照化してくれるので凄いです。
http://php.net/manual/ja/function.htmlspecialchars.php
http://webcache.googleusercontent.com/search?q=cache:l0-MAo6n7BEJ:www.programming-magic.com/20080328235111/+&cd=1&hl=ja&ct=clnk&gl=jp
http://next-nex.info/?s=456
http://php.net/manual/ja/function.mb-decode-numericentity.php
http://d.hatena.ne.jp/trip_off/20120328/1332910934
http://e-words.jp/p/r-htmlentity.html
http://e-words.jp/w/E382A8E383B3E38386E382A3E38386E382A3.html
PHPで特殊文字を含むすべての文字を文字参照「&#数字;」等に変換するツールを作ろうとして、特殊文字、特殊記号、文字参照、文字実体参照、数値文字参照、エンティティ、エンコードとデコードなどで悩みました。名称が似ており、何が何のことを示しているのか、理解に苦しみました。調べて理解したことをまとめます。
ざっくり文字参照、エンティティの説明
語弊がありますがまず大雑把に説明すると、特殊文字=特殊記号は、ざっくり言えば記号です。文字参照(文字実体参照=実体参照、数値文字参照=文字参照)は、「&#数字;」等のコードのことです。エンティティ「 entity 」は実体という意味で、例えば文字「あいうえお」をエンティティすると、その実体であるデータの集合の文字参照「&#数字;」になります。エンコードは変換することで、デコードは戻すことです。
HTMLエンティティ、文字エンティティ、数字エンティティなど、良く使われていますが、明確な定義は無いように見えます。雰囲気でHTMLエンティティだったら、<>"などHTMLの特殊文字を示しているような感じです。違うかもしれませんが良く分からず。
「実体参照」と「文字参照」の違い
文字参照とは、HTML等で直接記述できない文字や記号を、「&#数字;」等のコードに置き換えて表現する方法です。エンティティ化などとも言われます。すべての文字や数字に「&#数字;」が割り振られています。特殊文字や特殊記号が、ブラウザーや端末でうまく使用できない時などに利用されたりします。「&#数字;」と入力して、画面やブラウザーを通すと、対応した文字や数字で表示されます。
文字や数字(特殊文字や特殊記号)を置き換えるコードは、いろんなパターンがあります。ここが理解できず悩みました。まず「実体参照」と「文字参照」の2種類があります。
「実体参照」とは、「>」を「>」と表示します。
「文字参照」とは、「>」を「>」と表示します。
そして「文字参照」はさらに、「10進数」と「16進数」があります。
「10進数」は、「>」を「>」と表示します。
「16進数」は、「>」を「>」と表示します。
これらはどれが正しいというものではなく、使いやすいように利用するようです。実体参照は、見た目でどの記号が理解しやすいため、良く利用されているようです。
「htmlspecialchars」実体参照化
文字、変換、PHP等で検索しますと「htmlspecialchars」の良く出てきます。「htmlspecialchars」は、HTMLの一部の記号「<>&」等をエンティティ、実体参照化してくれます。その他の特殊記号や文字や数字や漢字は変換してくれません。ダブルクォーテーション「"」や「'」もエンティティ、実体参照化したい時は、「ENT_QUOTES」を使います。HTMLで利用するなら、「<>&"'」を実体参照化できれば、十分なので「htmlspecialchars」が使われています。
下記に参考コードです。textareaで実体参照を表示させています。HTMLで表示すると通常の文字で表示されてしまうからです。
<?php $str = "/:;@<>あいうえお123456漢字"; $str = htmlspecialchars($str, ENT_QUOTES); ?> <textarea name="text1" rows="10" cols="100"><?php echo htmlspecialchars($str); ?></textarea> ⇒出力例 /:;@<>あいうえお123456漢字
「mb_convert_encoding」文字参照化
その次に多くのサイトで「mb_convert_encoding」が紹介されています。本来は文字エンコーディングを変更するために使うようです。例えば「JIS」から「UTF-8」に変換するなどです。「HTML-ENTITIES」を加えることで、文字、数値、漢字を文字参照化してくれます。しかし記号っぽい「/:;@<>&」などは変換してくれません。下記に参考コードです。
<?php $str = "/:;@<>あいうえお123456漢字"; $str = mb_convert_encoding($str, 'HTML-ENTITIES', 'UTF-8'); ?> <textarea name="text1" rows="10" cols="100"><?php echo htmlspecialchars($str); ?></textarea> ⇒出力例 :;@<>あいうえお123456漢字
「mb_encode_numericentity」文字参照化
とても困りました。「htmlspecialchars」はhtmlの一部特殊文字だけ変換する。「mb_convert_encoding」は特殊文字が変換できないのです。調べて行くと「mb_encode_numericentity」を使うと両方変換できました。2番目の引数で変換するコード領域を指定して、一括で変換できます。$convmapという変数名が使われるようです。わかりやすいので、そうしています。3番目には、文字エンコーディングを指定します。これだけで、すべて文字参照化してくれるので凄いです。
$str = "/:;@<>あいうえお123456漢字"; $convmap = array(0, 0x10FFFF, 0, 0x10FFFF); $str = mb_encode_numericentity("$str", $convmap, 'UTF-8'); ?> <textarea name="text1" rows="10" cols="100"><?php echo htmlspecialchars($str); ?></textarea> ⇒出力例 /:;@<>あいうえお123456漢字
参考URL
http://www.phpbook.jp/func/string/index5.htmlhttp://php.net/manual/ja/function.htmlspecialchars.php
http://webcache.googleusercontent.com/search?q=cache:l0-MAo6n7BEJ:www.programming-magic.com/20080328235111/+&cd=1&hl=ja&ct=clnk&gl=jp
http://next-nex.info/?s=456
http://php.net/manual/ja/function.mb-decode-numericentity.php
http://d.hatena.ne.jp/trip_off/20120328/1332910934
http://e-words.jp/p/r-htmlentity.html
http://e-words.jp/w/E382A8E383B3E38386E382A3E38386E382A3.html