时间:2021-07-01 10:21:17 帮助过:6人阅读
- <br>zh_CN GB2312 <br>en_US.UTF-8 UTF-8 <br>zh_TW BIG5 <br>zh_HK BIG5-HKSCS <br>zh_TW.EUC-TW EUC-TW <br>zh_TW.UTF-8 UTF-8 <br>zh_HK.UTF-8 UTF-8 <br>zh_CN.GBK GBK <br> <br>例如、 <br>utf-8: setlocale(LC_ALL, ‘en_US.UTF-8′); <br>简体:setlocale(LC_ALL, ‘zh_CN'); <br><br>之所以给大家讲 setlocale()这个函数,是因为我导入csv文件到linux系统的时候发生了乱码,包括用了mb_convert_encoding()和iconv()两个函数都是没搞定最后问题的。最后就加了这一句setlocale(LC_ALL, ‘zh_CN');加在导入csv文件开始的代码前面就轻松搞定了,然后我又找了一下资料,发现fgetcsv()函数对区域设置是敏感的。比如说 LANG 设为 en_US.UTF-8 的话,单字节编码的文件就会出现读取错误,所以我们需要对其进行区域性的设置。特分享给大家。 <br><br>我还尝试用了以下代码也没能搞定,这些都是生成csv文件的header的设置。可能在我这里不起作用,但是在你那里也说不定哦。所以我都整理出来,尽可能的帮助遇到导入csv文件乱码的同行,因为在没办法的情况下真的太难处理了。大家可以都试试!总有一个是属于你的。 <br><br><u></u> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--?php <BR-->$csvContent="csvzero,csvone,csvtwo,csvthree,csvfour,csvfive"; <br>header("Content-Type: application/vnd.ms-excel; charset=GB2312"); <br>header("Pragma: public"); <br>header("Expires: 0"); <br>header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); <br>header("Content-Type: application/force-download"); <br>header("Content-Type: application/octet-stream"); <br>header("Content-Type: application/download"); <br>header("Content-Disposition: attachment;filename=CSV数据.csv "); <br>header("Content-Transfer-Encoding: binary "); <br>$csvContent = iconv("utf-8","gb2312",$csvContent); <br>echo $csvContent; <br>exit; <br>?> <br> <br>下面就再来具体看看php导入csv文件的代码: <br><br>两个函数简单介绍一下, <br><br>mb_detect_encoding()检测到的字符编码,或者无法检测指定字符串的编码时返回FALSE。 <br><br>fgetcsv() 函数从文件指针中读入一行并解析 CSV 字段。与fgets() 类似,不同的是 fgetcsv() 解析读入的行并找出 CSV 格式的字段,然后返回一个包含这些字段的数组。fgetcsv() 出错时返回 FALSE,包括碰到文件结束时。 <br><br>注释:从 PHP 4.3.5 起,fgetcsv() 的操作是二进制安全的。 <br><br>注释:CSV 文件中的空行将被返回为一个包含有单个 null 字段的数组,不会被当成错误。 <br><br>注释:该函数对区域设置是敏感的。比如说 LANG 设为 en_US.UTF-8 的话,单字节编码的文件就会出现读取错误。 <br><br>注释:如果碰到 PHP 在读取文件时不能识别 Macintosh 文件的行结束符,可以激活 auto_detect_line_endings 运行时配置选项。 <br><u></u> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--?php <BR-->setlocale(LC_ALL, 'zh_CN'); //设置地区信息(地域信息) <br>$file = $_FILES['files']; <br>$file_type = substr(strstr($file['name'],'.'),1); <br>if ($file_type != 'csv'){ <br>echo ""; <br>exit; <br>} <br>$handle = fopen($file['tmp_name'],"r"); <br>$file_encoding = mb_detect_encoding($handle); <br>if ($file_encoding != 'ASCII'){ <br>echo ""; <br>exit; <br>} <br>$row = 0; <br>$str=""; <br>$sy=""; <br>while ($data = fgetcsv($handle,1000,',')){ <br>$row++; <br>if ($row == 0) <br>continue; <br>$num = count($data); <br>for ($i=0; $i<$num; $i++){ <br>$str = (string)$data[$i].'|'; <br>$str = mb_convert_encoding($str, "UTF-8", "GBK"); //已知源码为GBK,转换为utf-8 <br>$sy .= $str; //我这里做的比较复杂,是用'|'将csv文件里面的内容用'|'全部拼起来,因为我导入的是商品信息,需要根据用户需 <br>//要导入的数据去定义哪些数据是需要导入的。 <br>} <br>} <br>if ($sy) { $sy = rtrim($sy, '|'); } <br>$arr = explode('|',$sy); <br>$key = array_slice($arr,0,$num); //这个数组就是csv文件里面标题,就是商品id,标题,卖点等等的数据 <br>$skey = array(); <br>$length = array(); <br>$co = count($arr); <br>$p = $co/$num; //求出要取出的数据的长度 <br>for($j=0;$j<$p;$j++){ <br>$offset=($j-1)*$num; //偏移量,就像分页一样,我这里根据偏移量取出的一个数组就是一个商品的信息。 <br>if($j==0){ <br>$length[] = array_slice($arr,0,$num); <br>}else{ <br>$length[] = array_slice($arr,$num+$offset,$num);//取出有哪些字段和商品 <br>} <br>} <br>$arrtitle = array(); <br>$arrfileds = array(); <br>$arrtagname = DB::select('字段标识', '字段名称')->from('字段表')->fetch_all(); <br>foreach ($arrtagname as $value) { <br>$arrfileds[$value['fileds_tags']] = $value['fileds_name']; <br>} <br>foreach ($fileds as $v) <br>{ <br>$temarr= explode('-', $v); <br>if (isset($temarr[0]) && !empty($temarr[0])) { <br>if (isset($temarr[1]) && !empty($temarr[1])) { <br>if ($temarr[1] == 'wenben') { <br>$arrtitle[] = $arrfileds[$temarr[0]].'文本'; <br>} <br>} else { <br>if ($temarr[0] != 'pic') { //是取出字段是图片就给去掉 <br>$arrtitle[] = $arrfileds[$temarr[0]]; <br>} <br>} <br>} <br><br>} <br><br>$skey = array(); <br>$order = array(); <br>$order[] = 'act_tag'; <br>$order[] = 'channel_tag'; <br>$order[] = 'created_time'; <br>$order[] = 'orderby'; <br>$rows =''; <br>$f = $co/$num;//求出有多少件商品 <br>for($p=0;$p<count($arrtitle);$p++){ <br="">//这里就是根据自己的需求查出自己需要的数据,通过用户需要的商品字段标识查出表里相对应的英文标识。 <br>$skey[]= DB::select('字段标识')->from('字段表')->where('字段名称', '=', $arrtitle[$p])->fetch_row(); <br>$rows .= $skey[$p]['字段标识'].'|'; <br>} <br>if($rows){ $rows = rtrim($rows,'|'); } <br>if(!empty($rows)){ $exrows = explode('|',$rows); }else{ $exrows = array(); } <br>$skeys = array_merge($order,$exrows); <br>$count1 = count($skeys); //字段的个数 <br>if(!empty($length)){ <br>for($x=1;$x<$f;$x++){ //求出有多少件商品就的循环多少次 <br>$orders = array(); <br>$orders[] = $act_tag; <br>$orders[] = $channel_tag; <br>$orders[] = time(); <br>$newlen = array_merge($orders,$length[$x]); <br>if($count1 !== count($newlen)){ //如果商品字段的长度和商品的长度不等就证明用户有哪个字段没录入 <br>$newrs = array(); <br>echo ""; <br>fclose($handle); <br>exit(); <br>}else{ //start <br>$arrimport = array_combine($skeys,$newlen); //如果两个数组是相等的我就合并数组,并把导入csv里面的日期改为时间戳存储到数据库 <br>if(!empty($arrimport['start_time'])){ $sta = strtotime($arrimport['start_time']); }else{ $sta=(int)0; } <br>if(!empty($arrimport['end_time'])){ $end = strtotime($arrimport['end_time']); }else{ $end=(int)0; } <br>$arrtime=array('start_time'=>$sta,'end_time'=>$end); <br>if(!empty($arrimport['start_time']) && !empty($arrimport['end_time'])){ <br>$newrs=array_merge($arrimport,$arrtime); <br>}else{ <br>$newrs = array(); <br>echo ""; <br>fclose($handle); <br>exit(); <br>} <br>if(count($skeys) == count($newrs)){ <br>DB::insert('商品表', array_values($skeys)) <br>->values(array_values($newrs)) <br>->execute(); <br>} <br>} //end <br>} <br>} <br>if($row-1==(int)0){ <br>echo ""; <br>}else{ <br>echo "</li><li><div style="display:none"></li><li><div class="login-box" id="login-dialog"></li><li><div class="login-top"><a class="current" rel="nofollow" id="login1" onclick="setTab('login',1,2);">登录</a></div></li><li><div class="login-form" id="nav-signin"></li><li> <!-- <div class="login-ico"><a rel="nofollow" class="qq" id="qqlogin" target="_blank" href="/user-center-qqlogin.html"> QQ </a></div> --></li><li><div class="login-box-form" id="con_login_1"></li><li><form id="loginform" action="/user-center-login.html" method="post" onsubmit="return false;"></li><li><p class="int-text"></li><li><input class="email" id="username" name="username" type="text" value="用户名或Email" onfocus="if(this.value=='用户名或Email'){this.value='';}" onblur="if(this.value==''){this.value='用户名或Email';};"></p></li><li><p class="int-text"></li><li><input class="password1" type="password" id="password" name="password" value="******" onblur="if(this.value=='') this.value='******';" onfocus="if(this.value=='******') this.value='';"></li><li></p></li><li><p class="int-info"></li><li> <label class="ui-label"> </label></li><li> <label for="agreement" class="ui-label-checkbox"></li><li> <input type="checkbox" value="" name="cookietime" id="cookietime" checked="checked"></li><li> <input type="hidden" name="notforward" id="notforward" value="1"></li><li> <input type="hidden" name="dosubmit" id="dosubmit" value="1">记住我的登录 </label> </li><li> <a rel="nofollow" class="aright" href="/user-center-forgetpwd.html" target="_blank"> 忘记密码? </a></p></li><li> <p class="int-btn"><a rel="nofollow" id="loginbt" class="loginbtn"><span>登录</span></a></p> </li><li> </form></li><li></div></li><li><form id="regform" action="/user-center-reg.html" method="post"></li><li><div class="login-reg" style="display: none;" id="con_login_2"></li><li><input type="hidden" name="t" id="t"></li><li> <p class="int-text"></li><li> <input id="email" name="email" type="text" value="Email" onfocus="if(this.value=='Email'){this.value='';}" onblur="if(this.value==''){this.value='Email';};"></p></li><li> <p class="int-text"></li><li> <input id="uname" name="username" type="text" value="用户名或昵称" onfocus="if(this.value=='用户名或昵称'){this.value='';}" onblur="if(this.value==''){this.value='用户名或昵称';};"></p></li><li> <p class="int-text"></li><li> <input type="password" id="pwd" name="password" value="******" onblur="if(this.value=='') this.value='******';" onfocus="if(this.value=='******') this.value='';"> </p></li><li> <p class="int-text1"><span class="inputbox"></li><li> <input id="validate" name="validate" type="text" value="验证码" onfocus="if(this.value=='验证码'){this.value='';}" onblur="if(this.value==''){this.value='验证码';};"></li><li> </span><span class="yzm-img"><img src="/user-checkcode-index" alt="看不清楚换一张" id="indexlogin"></span></p></li><li> <p class="int-info"></li><li> <label></li><li> <input value="" name="agreement" id="agreement" checked="checked" type="checkbox"></li><li> 我已阅读<a rel="nofollow" href="/user-center-agreement.html">用户协议</a>及<a rel="nofollow" href="/user-center-agreement.html">版权声明</a></label></li><li> </p></li><li> <p class="int-btn"><input type="hidden" name="dosubmit"></li><li><a rel="nofollow" class="loginbtn" id="register"><span>注册</span></a></p></li><li></div></li><li> </form></li><li></div></li><li></div></li><li></div></li><li></count($arrtitle);$p++){></li></ol></pre></li></ol></pre>