linus2k

君子常当当的博客

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  41 随笔 :: 1 文章 :: 21 评论 :: 0 Trackbacks

PHP fgetcsv 读入档案无「“」时,第一字符被删掉乱码

在使用 fgetcsv 读取 CSV 档案时,如该 CSV 档案的中文字有「“」时文字是可以正常的,

但在一般情况无「"」,则会出现第一个字符被吃掉的情况,以致出现乱码。

 

在网络上的数据多半是建议使用 setlocale 来解决问题

语法如下

 


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

 

但实际情况,并不会解决问题,

目前较好的方式是使用另外写的 function 来处理这问题

   function __fgetcsv(&$handle, $length = null, $d = ",", $e = '"')
   {
     
$d = preg_quote($d);
     
$e = preg_quote($e);
     
$_line = "";
     
$eof=false;
     
while ($eof != true)
      {
        
$_line .= (empty ($length? fgets($handle: fgets($handle, $length));
        
$itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
        
if ($itemcnt % 2 == 0)
           
$eof = true;
      }
     
$_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));      $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
     
preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
     
$_csv_data = $_csv_matches[1];
     
for ($_csv_i = 0$_csv_i < count($_csv_data); $_csv_i++)
      {      
$_csv_data[$_csv_i= preg_replace("/^" . $e . "(.*)" . $e . "$/s", "$1", $_csv_data[$_csv_i]);
        
$_csv_data[$_csv_i= str_replace($e . $e, $e, $_csv_data[$_csv_i]);
      }
     
return empty ($_line? false : $_csv_data;
   }
  

函数调用

   $handle = fopen("test.csv", "r");
   
while (!feof($handle)) {
       
print_r(__fgetcsv($handle));
   }
   
fclose($handle);

参考的网站为:http://blog.csdn.net/shilian_h/archive/2009/07/22/4371051.aspx

posted on 2011-07-22 10:05 君子常当当 阅读(555) 评论(0)  编辑 收藏 引用 所属分类: PHP编程纪念记忆力衰退
只有注册用户登录后才能发表评论。