PHP 中 mb_convert_encoding() 實作了將字串從一種字元編碼轉換為另一種字元編碼,但是在 PHP 8.2 時這個方法就棄用了,找到解決辦法並且測試一下。
先講結論,應該使用這個方法
function _($string)
{
return mb_encode_numericentity(
htmlspecialchars_decode(
htmlentities($string, ENT_NOQUOTES, 'UTF-8', false)
, ENT_NOQUOTES
), [0x80, 0x10FFFF, 0, ~0],
'UTF-8'
);
}
參考這裡是正確答案:
測試程式碼:
<?php
$string = '中文:!"$%&/()=ÖÄÜöäü<<accentué За матеріалами';
echo mb_convert_encoding($string, 'HTML-ENTITIES', 'utf-8')."\n\n";
// 方法 1
echo mb_encode_numericentity(
htmlspecialchars_decode(
htmlentities($string, ENT_NOQUOTES, 'UTF-8', false)
,ENT_NOQUOTES
), [0x80, 0x10FFFF, 0, ~0],
'UTF-8'
);
echo "\n\n";
// 方法 2
echo htmlspecialchars_decode(htmlentities($string));
變化後方法 1 和原方法是一樣的。先自首,我其實看不太懂這意思,丟個 AI 解釋水字數一下:
這段程式碼通過以下步驟將 UTF-8 字符串轉換為 HTML 實體:
htmlentities()
:將特殊字符轉換為 HTML 實體,但不處理引號。htmlspecialchars_decode()
:將 HTML 實體轉回原始字符。mb_encode_numericentity()
:將範圍內的字符轉換為數值實體表示,這裡的範圍[0x80, 0x10FFFF]
適用於大多數 Unicode 字符。
此方法提供更精確的 HTML 實體處理,尤其適合多字節字符編碼。
接下來就是接 DOMDocument 做 HTML 解析了,DOMDocument 還會有一個問題是 HTML5 不太支援,這算是用 PHP 做爬蟲的原罪吧。