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

PHP 解析 CSV 編碼問題:mb_detect_encoding 與 mb_convert_encoding 實戰

     編輯:PHP 相關知識

問題現象

使用 fgetcsv() 讀取 CSV 時,中文欄位比對失敗,strlen() 長度不符,實際上是編碼不一致 (CSV 為 Big5/GBK,PHP 內部為 UTF-8)。

解決流程

  1. 偵測編碼:mb_detect_encoding($str, 'UTF-8, BIG5, GBK, CP950')
  2. 轉換為 UTF-8:mb_convert_encoding($str, 'UTF-8', $detected)
  3. 再進行比對/處理

完整範例

<?php
$fp = fopen('data.csv', 'r');
if (!$fp) die("無法開啟檔案");

// 讀取標題列
$header = fgetcsv($fp);
$header = array_map(function($h) {
    return sanitize_csv_field($h);
}, $header);

while (($row = fgetcsv($fp)) !== false) {
    $row = array_map('sanitize_csv_field', $row);
    $data = array_combine($header, $row);
    
    // 現在可以正常比對中文
    if ($data['狀態'] === '已出貨') {
        // 處理邏輯...
    }
}
fclose($fp);

function sanitize_csv_field($field) {
    if ($field === null || $field === '') return '';
    $enc = mb_detect_encoding($field, 'UTF-8, BIG5, GBK, CP950, ASCII', true);
    if ($enc && $enc !== 'UTF-8') {
        $field = mb_convert_encoding($field, 'UTF-8', $enc);
    }
    // 移除 BOM
    $field = preg_replace('/^\\xEF\\xBB\\xBF/', '', $field);
    return trim($field);
}
?>

CSV 匯出時的編碼建議

// 匯出給 Excel 開啟:建議 UTF-8 with BOM
$bom = "\xEF\xBB\xBF";
$fp = fopen('export.csv', 'w');
fwrite($fp, $bom);
foreach ($rows as $row) {
    fputcsv($fp, $row);
}
fclose($fp);

常見編碼對照表

編碼別名說明mb_detect_encoding 參數
Big5繁體中文常用BIG5, BIG-5
CP950Windows 繁體中文代碼頁CP950
GBK簡體中文擴充GBK
CP936Windows 簡體中文代碼頁CP936
UTF-8通用、推薦UTF-8

進階:自動偵測整份 CSV 編碼

function detect_csv_encoding($file, $sampleLines = 100) {
    $fp = fopen($file, 'r');
    $encodings = [];
    for ($i = 0; $i < $sampleLines && ($line = fgets($fp)); $i++) {
        $enc = mb_detect_encoding($line, 'UTF-8, BIG5, GBK, CP950', true);
        if ($enc) $encodings[$enc] = ($encodings[$enc] ?? 0) + 1;
    }
    fclose($fp);
    arsort($encodings);
    return array_key_first($encodings) ?: 'UTF-8';
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved