<span><span><span class="hljs-meta"><?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 時,部分字符可能會被直接忽略或轉義不完整。
*
* 為了解決這一問題,`mb_encode_numericentity` 可以配合 `htmlentities` 使用,將非 ASCII 字符先转换为数字實體,再統一進行 HTML 轉義。
* 下面我們通過實際示例來講解這一流程。
*
* 一、基本用法示例
*/</span>
</span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-string">"你好,世界!<script>alert('XSS');</script>"</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">// 第一步:將非 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">// 第二步:将剩余内容轉義为 HTML 實體(如 < > & 等符號)</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">/**
* 輸出結果類似於:
* &#20320;&#22909;&#65292;&#19990;&#30028;&#65281;&lt;script&gt;alert(&#039;XSS&#039;);&lt;/script&gt;
*
* 可見,“你好,世界!” 中的中文字符已被轉換為十進制 HTML 實體,而脚本标签與引号等特殊字符也被成功轉義。
*
* 二、為何這樣做?
*
* - **增強兼容性**:htmlentities 在遇到非 ISO-8859-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` 實現雙向轉碼。
*
* 四、結語
*
* 結合使用 `mb_encode_numericentity` 與 `htmlentities` 能更安全、可靠地處理多語言環境下的字符編碼問題。
* 在處理任何用戶輸入、動態文本、或輸出至瀏覽器前,强烈建议进行此类轉義处理,以确保应用的稳定性與安全性。
*/</span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>