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

ThinkPHP 驗證碼頁面顯示亂碼?一鍵移除 BOM 解決方案

     編輯:PHP 綜合知識

問題背景

在使用 ThinkPHP 開發時,開啟驗證碼頁面偶爾會出現亂碼情況。這通常是因為專案中的 PHP 檔案被儲存為 UTF-8 with BOM 格式,導致輸出時在最前方混入不可見的 BOM 標記(EF BB BF),干擾了圖片二進位流的正常輸出。

核心解決思路

編寫一支 PHP 掃描腳本,遞迴遍歷專案目錄,偵測並自動移除所有 PHP 檔案頭部的 BOM 標記。將下列程式碼儲存為 remove_bom.php 放置於專案根目錄,透過瀏覽器訪問即可自動修復。

完整修復腳本

<?php
if (isset($_GET['dir'])) {
    $basedir = $_GET['dir'];
} else {
    $basedir = '.';
}
$auto = 1;
checkdir($basedir);

function checkdir($basedir) {
    if ($dh = opendir($basedir)) {
        while (($file = readdir($dh)) !== false) {
            if ($file != '.' && $file != '..') {
                if (!is_dir($basedir . "/" . $file)) {
                    echo "filename: $basedir/$file " . checkBOM("$basedir/$file") . " <br>";
                } else {
                    $dirname = $basedir . "/" . $file;
                    checkdir($dirname);
                }
            }
        }
        closedir($dh);
    }
}

function checkBOM($filename) {
    global $auto;
    $contents = file_get_contents($filename);
    $charset[1] = substr($contents, 0, 1);
    $charset[2] = substr($contents, 1, 1);
    $charset[3] = substr($contents, 2, 1);
    if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
        if ($auto == 1) {
            $rest = substr($contents, 3);
            rewrite($filename, $rest);
            return ("<font color=red>BOM found, automatically removed.</font>");
        } else {
            return ("<font color=red>BOM found.</font>");
        }
    } else {
        return ("BOM Not Found.");
    }
}

function rewrite($filename, $data) {
    $filenum = fopen($filename, "w");
    flock($filenum, LOCK_EX);
    fwrite($filenum, $data);
    fclose($filenum);
}
?>

操作步驟

  1. 將上述程式碼存為 remove_bom.php 放入專案根目錄。
  2. 瀏覽器訪問 https://yourdomain.com/remove_bom.php。
  3. 頁面將列出所有掃描檔案及處理結果,紅字標示已自動移除 BOM 的檔案。
  4. 完成後務必刪除此腳本,避免安全風險。

預防建議

  • 編輯器設定為「UTF-8 無 BOM」(如 VS Code、PhpStorm、Sublime Text 預設即為無 BOM)。
  • 團隊統一編碼規範,納入程式碼審查清單。
  • 部署前以 find . -name "*.php" -exec grep -l $'^\xEF\xBB\xBF' {} \; 快速排查。

套用此法可徹底解決 ThinkPHP 驗證碼、JSON 輸出、XML 輸出等場景下的 BOM 亂碼問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved