六月 25

[PHP]fgetcsv處理中文解決方案

使用fgetcsv取得csv檔資料時,中文首字元會有被截掉的問題,上PHP官網翻了一下,原來加上setlocale即可解決。
原本用PHP4沒出現這問題,大概是PHP5才會這樣吧...

// utf-8
setlocale(LC_ALL, 'en_US.UTF-8');
// big5
setlocale(LC_ALL, 'zh_TW.BIG5');

Modify 2008-06-29:
PHP5透過PEAR作檔案上傳的動作時,若發生檔案名稱首位中文前半個字元被吃掉的問題時,用上述方式也可解決。

另外分享今天匯入csv檔時的寫法,因欄位太多,所以用直接抓取第一行當欄位名的方式塞陣列(方便產生SQL)。

$fp = fopen("$file","r");
$rows = 0;
while(($ar = fgetcsv($fp, 1000, ","))!=false) {
  if ($rows!=0) {
    foreach($ar as $k=>$v) {
      $d['data'][$rows][$d['field'][$k]] = $v;
    }
  } else {
    foreach($ar as $k=>$v) {
      $d['field'][$k] = $v;
    }
  }
  $rows++;
}

Array
(
    [field] => Array
        (
            [0] => field1
            [1] => field2
            [2] => field3
        )

    [data] => Array
        (
            [1] => Array
                (
                    [field1] => value1
                    [field2] => value2
                    [field3] => value3
                )
            [2] => Array
                (
                    [field1] => value1
                    [field2] => value2
                    [field3] => value3
                )
        )
)

標籤:

06-25 17:47@ 網頁設計 | 回應 | | 隱藏資訊列將[PHP]fgetcsv處理中文解決方案加入HEMiDEMi書籤 將[PHP]fgetcsv處理中文解決方案加入del.icio.us書籤 將[PHP]fgetcsv處理中文解決方案加入MyShare書籤

回應 ( 發表您的回應 )

  1. 1
    由 阿天 於 2010-02-24 10:22:44 發表:

    意外逛到這裡, 這個code幫助我很大呀~
    原本有個轉成Csv亂七八糟的excel檔...竟然就這樣一套就出來了,實在非常感謝你的分享

  2. 2
    由 清爽小雨 於 2010-06-04 13:45:13 發表:

    我用你說的設定,但是發現csv檔第一列的欄位名稱讀入有問題。第一列內容如下:
    "姓名","性別","年齡","電話"
    我讀入後用print_r($d['field']) dump結果發現

    $d['field'][0]的值是 "姓名",而不是姓名。也就是那個括起來的雙引號也變成值的一部分。

    後來下trim($d['field'][0],'\"')結果變成 "姓名,後來那個沒了但是前面那個雙引號還在。

    我是用PHP 5.2.1。

    最後用winhex去看檔案16進位內容,居然發現csv檔最前面三個bytes是EF,BB,BF。

    請問你碰過這狀況嗎?要怎麼解決?

  3. 3
    由 清爽小雨 於 2010-06-04 15:42:18 發表:

    我找到原因了,因為UTF8 text file最前面會塞Begin of Mark(BOM),就是 EF BB BF三個字元,所以我用str_ireplace把他吃掉,再用trim($heading, '\"')就解決了。

  4. 4
    由 迷路 於 2010-06-30 11:46:04 發表:

    請問如何用str_ireplace把他吃掉?
    我用以下都不行:
    $h = str_ireplace( 0xEFBBBF, 0x000000, $h);
    $h = str_ireplace( 0xEFBBBF, 0x00, $h);
    $h = str_ireplace( 0xEFBBBF, "", $h);
    要怎麼解決?

錯誤訊息

留言回應


當別人有相當實力時,想想自己為何還在混。