linus2k

君子常当当的博客

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  41 随笔 :: 1 文章 :: 21 评论 :: 0 Trackbacks
<2025年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

相册

LifeCube

搜索

最新评论

阅读排行榜

评论排行榜

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 君子常当当 阅读(566) 评论(0)  编辑 收藏 引用 所属分类: PHP编程纪念记忆力衰退
只有注册用户登录后才能发表评论。