之前拿到的 csv 檔大部分都很乾淨,使用 PHP 內建的 fgetcsv 逐行解析不會有什麼問題,但今天解開一個欄位就發現它的字串長度跟預期的不同,並且無法用 ltrim 函式移除左側不要的字元,印出來看起來又正常。於是透過 ord 函式把前幾個字元印出來瞧瞧。

<?php

$handle = fopen("test.csv", "r"));
$data = fgetcsv($handle));

// 239
echo ord($data[0][0]);
// 187 
echo ord($data[0][1]);
// 191
echo ord($data[0][2]);

按照過去的經驗, 開頭的不可見字元應該是 BOM,查了 Wiki 也確定這三個數字是 UTF-8 的 BOM 沒錯。由於第一行是欄位說明,所以直接略過取第二行。