標籤: mb_encode_numericentity

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

    解決 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 做爬蟲的原罪吧。