由於客戶的資料是很舊的伺服器產出的 FoxPro dbf 檔案,要在 Linux 環境下透過 PHP 讀取古老的 FoxPro dbf 檔案,我一開始真的丈二金剛摸不著頭緒,要嘛透過 Linux 轉檔轉成 csv 再透過 PHP 讀出來存到 MySQL,不然就是找套件,試遍各種方法,找了幾個套件,有些 dbf 套件對於 memo 檔案讀取似乎不甚理想,讀不出資料,不然就是讀出一堆亂碼,終於找到一個可以正確運作的套件。

nchizhov/inok-dbf

PHP 使用範例

<?php
    require '../common/vendor/autoload.php';
    use Inok\Dbf;
    $dbfFile = 'samplefile.DBF';//主檔案
    $fptFile = 'sampefile.FPT'; //memo 檔案
    if(file_exists($dbfFile) && file_exists($fptFile)){
        $dbftable = new \Inok\Dbf\Table($dbfFile,866); //default charset: 866
        $memo = new \Inok\Dbf\Memo($fptFile);
        $headers=$dbftable->getHeaders();
        $columns=$dbftable->getColumns();
        $data = $dbftable->getData();
        $records = new \Inok\Dbf\Records($data, 866 , $headers, $columns);
        $c = 0;
        while ($Record = $records->nextRecord()) {
            $column1 = $Record['column1'];; //欄位一
            $column2 = $Record['column2']; //欄位二
            $column3 = $Record['column3']; //欄位三
            $content = $Record['content']; //memo內的資料
            $content = iconv('big-5','utf-8//IGNORE', $content);
            $c++;
        }
        $dbftable->close(); //關閉檔案
    }
}

由於客戶的 memo 裡面有特殊造字導致讀資料時造成整個欄位資料無法轉成 utf-8 該欄位變成空資料,在使用 iconv() 轉碼時需要增加 //IGNORE 參數才能讀出其他字或者直接使用 mb_convert_encoding()來把BIG-5轉換成UTF-8,但該字附近三個字都顯示成亂碼狀態,但至少可以讀出其他資料。

$content = iconv('big-5','utf-8//IGNORE', $content);

$content = mb_convert_encoding($content, 'utf-8', 'big-5');
最後修改日期: 2020 年 9 月 24 日