首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP htmlspecialchars 與 htmlentities 差異詳解與中文編碼處理

     編輯:PHP 相關知識

PHP 提供兩個 HTML 實體編碼函數:htmlspecialchars() 與 htmlentities()。兩者皆用於防止 XSS 攻擊、將特殊字元轉為 HTML 實體,但處理範圍與中文支援度截然不同。本文詳細比較並提供最佳實務。

核心差異一覽

特性htmlspecialchars()htmlentities()
轉換範圍僅 5 個特殊字元:& " ' < >所有可轉換為 HTML 實體的字元(含拉丁文、希臘文、中文等)
中文處理不動中文,直接保留若未指定編碼,會將中文轉為實體(導致亂碼)
效能較快較慢(掃描範圍大)
常用旗標ENT_COMPAT / ENT_QUOTES / ENT_NOQUOTES同左

htmlspecialchars() - 推薦用於一般輸出轉義

<?php
$str = "John & 'Adams'";
// ENT_COMPAT:預設,僅轉雙引號
echo htmlspecialchars($str, ENT_COMPAT);   // John & 'Adams'
// ENT_QUOTES:雙引號與單引號皆轉
echo htmlspecialchars($str, ENT_QUOTES);   // John & 'Adams'
// ENT_NOQUOTES:引號皆不轉
echo htmlspecialchars($str, ENT_NOQUOTES); // John & 'Adams'
?>

轉換對照:& → &amp;、" → &quot;、' → '(ENT_QUOTES)、< → &lt;、> → &gt;。

htmlentities() - 完整實體化(需指定編碼)

<?php
$str = "測試頁面";
// 未指定編碼:預設 ISO-8859-1,中文會變亂碼實體
echo htmlentities($str); 
// 輸出:²âÊÔÒ³Ãæ

// 指定編碼:正確處理中文
echo htmlentities($str, ENT_COMPAT, "UTF-8"); 
// 或 GB2312/Big5
echo htmlentities($str, ENT_COMPAT, "GB2312"); 
// 輸出:測試頁面(中文保持可讀,特殊符號實體化)
?>

實戰比較範例

<?php
$str = '測試頁面  & "quotes"';

echo "htmlentities (UTF-8):\n";
echo htmlentities($str, ENT_QUOTES, "UTF-8") . "\n\n";

echo "htmlspecialchars:\n";
echo htmlspecialchars($str, ENT_QUOTES, "UTF-8") . "\n";
/*
htmlentities (UTF-8):
測試頁面 <script>alert(1)</script> & "quotes"

htmlspecialchars:
測試頁面 <script>alert(1)</script> & "quotes"
*/
?>

旗標參數說明

  • ENT_COMPAT(預設):轉換雙引號,不轉單引號
  • ENT_QUOTES:雙引號與單引號皆轉換 (推薦)
  • ENT_NOQUOTES:引號皆不轉換
  • ENT_HTML401 / ENT_HTML5 / ENT_XML1 / ENT_XHTML:指定文件型別(PHP 5.4+)

最佳實務建議

  1. 防 XSS 輸出轉義:統一使用 htmlspecialchars($str, ENT_QUOTES, 'UTF-8'),效能佳且不動中文。
  2. 需完整實體化(如匯出 XML/舊系統):使用 htmlentities($str, ENT_QUOTES, 'UTF-8'),並確保編碼參數正確。
  3. 資料庫儲存:勿在寫入 DB 前轉義,應在「輸出到 HTML」時才轉義,保持原始資料純淨。
  4. 雙重編碼問題:若資料可能已含實體,PHP 5.2.3+ 可加 ENT_HTML5 或手動 html_entity_decode() 後再編碼。

快速封裝函數

<?php
function h($str, $flags = ENT_QUOTES, $encoding = 'UTF-8') {
    return htmlspecialchars($str, $flags, $encoding);
}
function he($str, $flags = ENT_QUOTES, $encoding = 'UTF-8') {
    return htmlentities($str, $flags, $encoding);
}
// 使用:echo h($userInput);
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved