現在の位置: ホーム> 最新記事一覧> キャラクターエンコーディング処理のためにHTMLENTITIESでMB_ENCODE_NUMERICALENTITYをより適切に使用する方法は?

キャラクターエンコーディング処理のためにHTMLENTITIESでMB_ENCODE_NUMERICALENTITYをより適切に使用する方法は?

gitbox 2025-08-19
<span><span><span class="hljs-meta">&lt;?php</span></span><span>

</span><span><span class="hljs-comment">// このドキュメントは、よりよく使用する方法を示しています mb_encode_numericentity マッチ htmlentities 文字エンコーディング処理を実行します</span></span><span>
</span><span><span class="hljs-comment">// のために PHP 環境でマルチバイト文字を処理するときに、文字化けのコードや情報の損失を避けてください</span></span><span>

</span><span><span class="hljs-comment">// ----------------------------</span></span><span>

<span class="hljs-comment">/**
 * それをよりよく使用する方法 mb_encode_numericentity マッチ htmlentities 文字エンコーディング処理を実行します?
 *
 * 処理には、非処理が含まれます ASCII 文字の多言語コンテンツ(中国語のように、日本語、韓国語など)時間,PHP の `htmlentities` 函数常のために将特殊キャラクター转换为 HTML 実在物,避けるため XSS セキュリティの問題。
 * しかし,`htmlentities` 对多字节キャラクターの支持有限,特に文字セットが設定されている場合 UTF-8 時間,1つ部の文字は、直接無視されたり、不完全に逃げたりする場合があります。
 *
 * この問題を解決するために,`mb_encode_numericentity` 協力できます `htmlentities` 使用,しません ASCII キャラクター先转换为数字実在物,統1つされた方法でそれを実施します HTML 逃げる。
 * 実用的な例を通してこのプロセスを説明しましょう。
 *
 * 1つ、基本的な使用例
 */</span>

</span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-string">"こんにちは,世界!&lt;script&gt;alert('XSS');&lt;/script&gt;"</span></span><span>;
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-string">'UTF-8'</span></span><span>;

</span><span><span class="hljs-comment">// 定义実在物转换範囲(0x80 到着 0xFFFF すべての非を示します ASCII キャラクター)</span></span><span>
</span><span><span class="hljs-variable">$convmap</span></span><span> = [</span><span><span class="hljs-number">0x80</span></span><span>, </span><span><span class="hljs-number">0xffff</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0xffff</span></span><span>];

</span><span><span class="hljs-comment">// 第1つ步:しません ASCII キャラクター转换为数字実在物</span></span><span>
</span><span><span class="hljs-variable">$numericEntity</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_encode_numericentity</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-variable">$convmap</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);

</span><span><span class="hljs-comment">// ステップ2:将剩余内容逃げる为 HTML 実在物(のように &lt; &gt; &amp; シンボル)</span></span><span>
</span><span><span class="hljs-variable">$escapedOutput</span></span><span> = </span><span><span class="hljs-title function_ invoke__">htmlentities</span></span><span>(</span><span><span class="hljs-variable">$numericEntity</span></span><span>, ENT_QUOTES | ENT_HTML5, </span><span><span class="hljs-variable">$encoding</span></span><span>);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$escapedOutput</span></span><span>;

<span class="hljs-comment">/**
 * 出力の結果はに似ています:
 * &amp;#20320;&amp;#22909;&amp;#65292;&amp;#19990;&amp;#30028;&amp;#65281;&amp;lt;script&amp;gt;alert(&amp;#039;XSS&amp;#039;);&amp;lt;/script&amp;gt;
 *
 * 見える,“こんにちは,世界!” 中の中文キャラクター已被转换为十进制 HTML 実在物,而脚本标签そして引号等特殊キャラクター也被成功逃げる。
 *
 * 二、なぜこれをするのですか?
 *
 * - **互換性の向上**:htmlentities 在遇到着非 ISO-8859-1 编码キャラクター時間行为不1つ,協力します mb_encode_numericentity 可确保所有キャラクター都被显式处理;
 * - **安全性を向上させます**:XSS 多くの場合、攻撃が注入されます HTML タグまたは JavaScript 達成するために,提前逃げる所有可疑キャラクター可大大降低风险;
 * - **文字化けのコードは避けてください**:在输出到着网页、ログ、或数据库時間,多字节キャラクターのように果未正确逃げる可能被误解释,したがって、文字化けされたコードまたはデータの異常が発生します。
 *
 * 三つ、注意すべきこと
 *
 * 1. `mb_encode_numericentity` あること `htmlentities` **前に** 電話,そうでなければ、そうではありません ASCII キャラクター可能会被提前截断或忽略。
 * 2. `convmap` の设置要覆盖目标キャラクターの Unicode 範囲,常用配置のように `[0x80, 0xffff, 0, 0xffff]` ほとんどをカバーするのに十分です UTF-8 キャラクター。
 * 3. 処理されている場合 HTML コンテンツを入力します(例のように用户提交の富文本),建议協力します `html_entity_decode` そして `mb_decode_numericentity` 双方向のトランスコーディングを実現します。
 *
 * 4、結論
 *
 * 組み合わせて使用します `mb_encode_numericentity` そして `htmlentities` より安全になる可能性があります、可靠地处理多语言环境下のキャラクター编码问题。
 * ユーザーの入力を処理します、動的テキスト、またはブラウザへの出力,强烈建议进行此类逃げる处理,以确保应用の稳定性そして安全性。
 */</span>

</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>