解決 PHP8.2 mb_convert_encoding 方法已經棄用的問題。

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 實體:

  1. htmlentities():將特殊字符轉換為 HTML 實體,但不處理引號。
  2. htmlspecialchars_decode():將 HTML 實體轉回原始字符。
  3. mb_encode_numericentity():將範圍內的字符轉換為數值實體表示,這裡的範圍 [0x80, 0x10FFFF] 適用於大多數 Unicode 字符。

此方法提供更精確的 HTML 實體處理,尤其適合多字節字符編碼。

接下來就是接 DOMDocument 做 HTML 解析了,DOMDocument 還會有一個問題是 HTML5 不太支援,這算是用 PHP 做爬蟲的原罪吧。


已發佈

分類:

作者: