2 回答

TA貢獻1820條經驗 獲得超9個贊
我終于找到了可行的解決方案。經過大量調查后,我相信它是用 UTF-16 編碼的,盡管 BOM 字符可能已經說明了這一點。
我剛剛編寫了一個簡單的函數來轉換我傳遞給 SQL 的每個 CSV 值。
function Convert($str)
{
return mb_convert_encoding($str, "UTF-8", "UTF-16BE");
}
........
$updateQuery = "UPDATE supplier SET ".$supplier." = '".Convert($row[2])."' WHERE supplierItemCode = '".Convert($row[0])."'";
我不確定為什么 BOM 會導致此類問題,以及為什么完全刪除它不起作用。感謝大家的幫助讓我發現了編碼問題。

TA貢獻1853條經驗 獲得超9個贊
嘗試對打開和讀取 CSV 文件的代碼進行以下修改。它檢查 BOM 是否存在,如果存在則繞過它:
$cvsRow = [];
// Open File
$csvData = fopen($file, "r");
if($csvData !== FALSE)
{
$BOM = fread($csvData, 4); // read potential BOM sequences to see if one is present or not
if ($BOM !== FALSE)
{
if (strlen($BOM) >= 3 && substr_compare($BOM, "\xef\xbb\xbf", 0, 3) == 0)
{
fseek($csvData, 3); // found UTF-8 encoded BOM
}
elseif (strlen($BOM) >= 2 && (substr_compare($BOM, "\xfe\xff", 0, 2) == 0 || substr_compare($BOM, "\xff\xfe", 0, 2) == 0))
{
fseek($csvData, 2); // found UTF-16 encoded BOM
}
elseif ($BOM != "\00\00\xfe\xff" && $BOM != "\xff\xfe\00\00")
{
fseek($csvData, 0); // did not find UTF-32 encoded BOM
}
while(!feof($csvData))
{
$csvRow[] = fgetcsv($csvData, 100);
}
}
// Close file (only if it has been successfully opened)
fclose($csvData);
}
- 2 回答
- 0 關注
- 171 瀏覽
添加回答
舉報