PHPの文字参照化、エンティティ処理、各方法の違い

おすすめ記事ピックアップ

PHPの「htmlspecialchars」、「mb_convert_encoding」、「mb_encode_numericentity」の文字参照化、エンティティ処理、各方法の違いをまとめてみました。

PHPで特殊文字を含むすべての文字を文字参照「&#数字;」等に変換するツールを作ろうとして、特殊文字、特殊記号、文字参照、文字実体参照、数値文字参照、エンティティ、エンコードとデコードなどで悩みました。名称が似ており、何が何のことを示しているのか、理解に苦しみました。調べて理解したことをまとめます。

ざっくり文字参照、エンティティの説明

語弊がありますがまず大雑把に説明すると、特殊文字=特殊記号は、ざっくり言えば記号です。文字参照(文字実体参照=実体参照、数値文字参照=文字参照)は、「&#数字;」等のコードのことです。

エンティティ「 entity 」は実体という意味で、例えば文字「あいうえお」をエンティティすると、その実体であるデータの集合の文字参照「&#数字;」になります。エンコードは変換することで、デコードは戻すことです。

HTMLエンティティ、文字エンティティ、数字エンティティなど、良く使われていますが、明確な定義は無いように見えます。雰囲気でHTMLエンティティだったら、<>"などHTMLの特殊文字を示しているような感じです。違うかもしれませんが良く分からず。

「実体参照」と「文字参照」の違い

文字参照とは、HTML等で直接記述できない文字や記号を、「&#数字;」等のコードに置き換えて表現する方法です。エンティティ化などとも言われます。すべての文字や数字に「&#数字;」が割り振られています。

特殊文字や特殊記号が、ブラウザーや端末でうまく使用できない時などに利用されたりします。「&#数字;」と入力して、画面やブラウザーを通すと、対応した文字や数字で表示されます。

文字や数字(特殊文字や特殊記号)を置き換えるコードは、いろんなパターンがあります。ここが理解できず悩みました。まず「実体参照」と「文字参照」の2種類があります。

「実体参照」とは、「>」を「&gt;」と表示します。
「文字参照」とは、「>」を「&#62;」と表示します。

そして「文字参照」はさらに、「10進数」と「16進数」があります。

「10進数」は、「>」を「&#62;」と表示します。
「16進数」は、「>」を「&#x3e;」と表示します。

これらはどれが正しいというものではなく、使いやすいように利用するようです。実体参照は、見た目でどの記号が理解しやすいため、良く利用されているようです。

「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>

⇒出力例 /:;@&lt;&gt;あいうえお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>

⇒出力例 :;@<>&#12354;&#12356;&#12358;&#12360;&#12362;123456&#28450;&#23383;

「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>

⇒出力例 &#47;&#58;&#59;&#64;&#60;&#62;&#12354;&#12356;&#12358;&#12360;&#12362;&#49;&#50;&#51;&#52;&#53;&#54;&#28450;&#23383;

参考URL

http://www.phpbook.jp/func/string/index5.html
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



いいね!と思ったらお願いします。


名前

AddToAny adsence adwords Amazon AmazonFBA Calculator Analytics Blogger BMAG chrome CODEPREP Eclipse envato facebook FAQ feedly Font Awesome Geek Press Gifzo Illustrator kindle LinkWithin Logaster myfonts NAVER Photoshop PHP picasa Premiere Similarweb TOPSY tumblr Wordpress wpX XAMPP zenback ウェブマスターツール ウハウハモウケタイ カスタマイズ ゲストシリーズ ココナラ サイト制作 ドメイン はじめに プレスリリース プレスリリース作成 プレスリリース利点 まとめ ランディングページ リリース送付先の見つけ方 レビュー 考察 子孫セレクタ 思いつきサイト制作 書評 足成 台湾 通販 日記 忍者おまとめボタン 文章の基本
false
ltr
item
ふりむけばコウホウ : PHPの文字参照化、エンティティ処理、各方法の違い
PHPの文字参照化、エンティティ処理、各方法の違い
PHPの「htmlspecialchars」、「mb_convert_encoding」、「mb_encode_numericentity」の文字参照化、エンティティ処理、各方法の違いをまとめてみました。 PHPで特殊文字を含むすべての文字を文字参照「&#数字;」等に変換するツールを作ろうとして、特殊文字、特殊記号、文字参照、文字実体参照、数値文字参照、エンティティ、エンコードとデコードなどで悩みました。名称が似ており、何が何のことを示しているのか、理解に苦しみました。調べて理解したことをまとめます。
http://4.bp.blogspot.com/-bN7y5GrlZXY/UpIGEE7-3WI/AAAAAAAANRM/gM1jX3P2yK0/s1600/000005.png
http://4.bp.blogspot.com/-bN7y5GrlZXY/UpIGEE7-3WI/AAAAAAAANRM/gM1jX3P2yK0/s72-c/000005.png
ふりむけばコウホウ
http://www.furimuke.com/2013/11/htmlspecialchars-mbconvertencoding-mbencodenumericentity.html
http://www.furimuke.com/
http://www.furimuke.com/
http://www.furimuke.com/2013/11/htmlspecialchars-mbconvertencoding-mbencodenumericentity.html
true
8618648785166852656
UTF-8
Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All 関連記事:もっと見るはクリック→ LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS CONTENT IS PREMIUM Please share to unlock Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy