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

ThinkPHP 驗證碼頁面顯示亂碼?一鍵掃描全專案移除 BOM 修復腳本

     編輯:PHP 相關知識

ThinkPHP 驗證碼頁面顯示亂碼?一鍵掃描全專案移除 BOM 修復腳本

ThinkPHP 開發中常遇驗證碼頁面輸出亂碼(實為圖片二進制被 BOM 污染)。根因同 Session 失效:UTF-8 BOM 導致標頭輸出提前。提供一個遞歸掃描專案目錄、自動檢測並移除 BOM 的獨立修復腳本,放入專案根目錄訪問即可執行。

修復腳本完整代碼(存為 remove_bom.php 置於專案根目錄)

<?php
if (isset($_GET['dir'])) {
    $basedir = $_GET['dir'];
} else {
    $basedir = '.';
}
$auto = 1; // 1=自動移除,0=僅檢測
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>");
        }
    }
    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 放入專案公開目錄(如 public/ 或根目錄)
  2. 瀏覽器訪問 https://yourdomain/remove_bom.php 掃描當前目錄
  3. 或指定目錄 https://yourdomain/remove_bom.php?dir=./Application
  4. 頁面列出每個檔案檢測結果:BOM found, automatically removed. 表示已修復
  5. 執行完畢後務必刪除此腳本,避免安全風險

腳本邏輯解析

  • checkdir 遞歸遍歷目錄樹
  • checkBOM 讀取檔案前 3 位元組,匹配 EF BB BF (UTF-8 BOM)
  • $auto=1 時自動截除前 3 位元組並覆寫檔案(flock 防併發)
  • 輸出 HTML 格式結果,紅色標記已修復檔案

預防勝於治療:編輯器配置最佳實踐

  • PhpStorm/IntelliJ:Settings → Editor → File Encodings → 「Remove BOM」
  • VS Code:預設無 BOM,Status Bar 點擊編碼可切換「Save with BOM」勿勾選
  • Sublime Text:File → Save with Encoding → 「UTF-8」(非 UTF-8 with BOM)
  • Notepad++:Encoding → 「Convert to UTF-8」(非 Convert to UTF-8-BOM)

定期執行掃描腳本 + 統一編輯器配置,徹底杜絕 BOM 導致的驗證碼亂碼、Session 失效等疑難雜症。

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