解決 OCS Inventory 匯出中文亂碼

🛠️ 解決 OCS Inventory 匯出 CSV 中文亂碼問題

在預設情況下,OCS Inventory 網頁後台匯出 CSV 是採用純 UTF-8 編碼。當我們直接使用微軟 Excel 雙擊打開時,Excel 會預設以系統編碼(如繁體中文的 Big5)去解讀,進而導致所有中文資產欄位、電腦描述全部變成亂碼。

本教學將指引你如何透過修改 OCS 後台的核心 PHP 原始碼,一勞永逸地在 CSV 檔案開頭注入 BOM 標頭(\xEF\xBB\xBF),讓微軟 Excel 能夠完美識別中文。


📝 核心修復步驟

  1. 尋找核心檔案:
    請透過 1Panel 的文件管理功能、FTP 或終端機,找到負責處理「所有計算機/電腦總表」資料匯出的主程式,路徑通常位於:
    /opt/1panel/docker/compose/ocs/ocsreports/plugins/main_sections/ms_export/ms_csv.php
  2. 開啟並編輯檔案:
    使用文字編輯器打開 ms_csv.php,並往下捲動至檔案最末尾處(大約在整份檔案倒數第 15 至 20 行之間)。
  3. 尋找關鍵輸出區塊:
    在檔案尾端找到以下負責將資料打包並發送給瀏覽器下載的原始程式碼:

        if ($toBeWritten != "") {
        // Generate output page for DB data export
            header("Content-Disposition: attachment; filename=\"export.csv\"");
            header("Content-Length: " . strlen($toBeWritten));
            echo $toBeWritten;
        }
    
  4. 替換為修正版代碼:
    請將上述的程式碼區塊,完整替換為下方加入 BOM 標頭的修正版本

        if ($toBeWritten != "") {
        // Generate output page for DB data export
            header("Content-Disposition: attachment; filename=\"export.csv\"");
            
            // 修正 1:手動加上 3 位元組的 BOM 標頭,因此總長度需額外 + 3,避免尾端資料被截斷
            header("Content-Length: " . (strlen($toBeWritten) + 3)); 
            
            // 修正 2:在輸出真實資料前,強制先注入 UTF-8 的 BOM 簽章(\xEF\xBB\xBF)
            echo "\xEF\xBB\xBF"; 
            
            echo $toBeWritten;
        }
    
  5. 儲存檔案:
    點擊儲存變更。由於 PHP 是動態解析語言,此修改不需要重新啟動 Docker 容器,儲存後會立即生效。

💡 為什麼這樣修改就能根治亂碼?

  • \xEF\xBB\xBF 的作用: 這是 UTF-8 編碼的「位元組順序記號 (BOM)」。當微軟 Excel 雙擊打開任何 CSV 檔案時,只要在檔案最開頭偵測到這三個字元,就會自動切換解碼引擎至 UTF-8。
  • strlen($toBeWritten) + 3 的必要性: 既然我們強制多塞了三個隱藏字元,就必須修改 HTTP Header 告訴瀏覽器的 Content-Length 檔案大小,否則瀏覽器會判定資料未傳完,導致 CSV 最後一行的末尾文字被裁切。

完成上述修改後,未來任何人直接從 OCS 管理後台下載資產報表,直接雙擊打開微軟 Excel 都能整齊、完美地顯示中文了!

Add a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *