必須指定 ENT_HTML5,並將 double_encode=false,才能避免雙重編碼。
原因是與文件相反,double_encode=false 並不會無條件且全域地防止所有現有實體的雙重編碼。至關重要的是,它只會跳過為所選文件類型明確有效的那些字元實體的雙重編碼!
由於 ENT_HTML5 引用了最廣泛的字元實體清單,因此它是對現有字元實體最寬容的唯一設定。
<?php
declare(strict_types=1);
$text = 'ampersand(&), double quote("), single quote('), less than(<), greater than(>), numeric entities(&"'<>), HTML 5 entities(+,!$(ņ€)';
$result3 = htmlspecialchars( $text, ENT_NOQUOTES | ENT_SUBSTITUTE, 'UTF-8', false );
$result4 = htmlspecialchars( $text, ENT_NOQUOTES | ENT_XML1 | ENT_SUBSTITUTE, 'UTF-8', false );
$result5 = htmlspecialchars( $text, ENT_NOQUOTES | ENT_XHTML | ENT_SUBSTITUTE, 'UTF-8', false );
$result6 = htmlspecialchars( $text, ENT_NOQUOTES | ENT_HTML5 | ENT_SUBSTITUTE, 'UTF-8', false );
echo "<br />\r\nHTML 4.01:<br />\r\n", $result3,
"<br />\r\nXML 1:<br />\r\n", $result4,
"<br />\r\nXHTML:<br />\r\n", $result5,
"<br />\r\nHTML 5:<br />\r\n", $result6, "<br />\r\n";
?>
會產生
HTML 4.01 (將不會識別單引號,但會識別歐元符號)
ampersand(&), 雙引號("), 單引號('), 小於符號(<), 大於符號(>), 數值實體(&"'<>), HTML 5 實體(+,!$(ņ€)
XML 1 (會識別單引號,但不會識別歐元符號)
ampersand(&), 雙引號("), 單引號('), 小於符號(<), 大於符號(>), 數值實體(&"'<>), HTML 5 實體(+,!$(ņ€)
XHTML (會識別單引號和歐元符號)
ampersand(&), 雙引號("), 單引號('), 小於符號(<), 大於符號(>), 數值實體(&"'<>), HTML 5 實體(+,!$(ņ€)
HTML 5 (會識別「所有」有效的字元實體)
ampersand(&), 雙引號("), 單引號('), 小於符號(<), 大於符號(>), 數值實體(&"'<>), HTML 5 實體(+,!$(ņ€)