php使用fgetcsv读取csv文件乱码解决方法

 更新时间:2016年11月25日 15:40  点击:1888
在php中碰到乱码多半是编码问题了,在这里我们分析了很久得出了下面fgetcsv读取csv文件乱码原因所在与解决办法。

例子

 

 代码如下 复制代码

function get_csv_contents( $file_target ){

 $handle  = fopen( $file_target, 'r');

 while ($data = fgetcsv($handle, 1000, ",")) {
 
  $num = count($data);
  echo "<p> $num fields in line $row: <br>n";
  $row++;
  for ($c=0; $c < $num; $c++) {
   echo $data[$c]. "<br>n";;
   /*echo getUTFString($data[$c])*/
  }
 }

 fclose($handle);
}

导入的csv文件是以ansi编码保存的,对于中文操作系统环境对应的应该就是gbk编码了,通过手动更改浏览器字符编码为gbk,乱码的情况消失了,于时进行了下面调整。

 代码如下 复制代码

$data = eval(‘return ‘.iconv(‘gbk’,'utf-8′,var_export($data,true)).’;');

$data为需要转换编码的数组。

补充:LINUX FGETCSV读取GBK数据乱码

当Linux系统是使用的默认设置,则在该Linux服务器上对gbk的csv格式文件进行处理的时候,就会出现乱码现象。
解决方法是:
使用 setlocale 函数设置环境变量。比如要设置使用gb 的区域设置可以在fgetcsv前使用下面的语句。

 代码如下 复制代码

setlocale(LC_ALL,array('zh_CN.gbk','zh_CN.gb2312','zh_CN.gb18030'));

具体使用哪些locale 可以使用linux 命令 locale -a 查看系统支持哪些

curl来抓取网页内容是一个性能比较好的函数了,我们通常会使用它来快速模仿用户去访问我们要抓取的网页了,下面看一个例子有兴趣的朋友可进入参考。

早上想写了一个抓取是京东618魅族专题页的抓取,然后想着自动下单购买,尼玛,算了,太多了,写到判断是否开始了,商品价格进行了变化,后边工程量有点大就懒的写了,如果要完善的话就需要写模拟登陆(这个不难)加入购物车,下单,下单的时候判断一下价格,如果价格个官方优惠价格相同就下单,不同就接着去抓。算了,懒的写了。下边是部分代码

 代码如下 复制代码

<?php
$cookie_file = dirname(__FILE__)."/jd.cookie";
//专题首页url
$indexurl = 'http://sale.jd.com/act/BOxFsKPGNZwpet4.html';
//获取专题页到产品详情的地址
$indexstr = get($indexurl);
//var_dump($indexstr);exit;
preg_match_all('/<area shape="rect" coords="802,199,941,244" href="(.*?)"/is',$indexstr,$data);

$tmp = pathinfo($data[1][0]);
$pinfo['id'] = $tmp['filename'];
$pinfo['url'] = $data[1][0];
unset($tmp,$data);
$pinfo = getPrice($pinfo['id']);
if($pinfo['mainproduct']['price'] == 1799){
addcar();
}else{
echo "还没有开始抢购";
}

function get($url,$flag=true){
global $cookie_file;
$headerArray = array(
"content-type: application/x-www-form-urlencoded;charset=UTF-8",


);
//echo $cookie_file;exit;
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_USERAGENT,'"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0"');
curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);//设置头信息
curl_setopt($ch,CURLOPT_COOKIEFILE,$cookie_file);
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);

$return = curl_exec($ch);
curl_close($ch);
if($flag)$return = gzdecode($return);
return $return;
}

function getPrice($id){
$priceUrl = "http://rs.jd.com/accessorie/newServiceWhite.jsonp?sku=".$id;

$data = json_decode(get($priceUrl,false),true);
return $data;
}
function addcar(){
global $pinfo;
$addurl = "http://gate.jd.com/InitCart.aspx?pid=".$pinfo['mainproduct']['sku']."&pcount=1&ptype=1";

echo get($addurl,false);
}

php 在curl抓取的时候出现乱码

用站长工具查看我们抓取的网而不是使用了gzip压缩了,如果有返回"Accept-Encoding:gzip, deflate" 就是打开了gzip了,我们只要如下操作

 代码如下 复制代码

$res=curl_exec($ch1);
if(!empty($res)){ //save capcha
echo gzdecode($res);
}

GBK或者UTF8汉字之类的乱码

 代码如下 复制代码

mb_convert_encoding($str, 'utf-8', 'GBK,UTF-8,ASCII');就行了

我们设置页面为GBK兼容GB2312,GB2312是GBK的子集,所有GB2312编码的用GBK都能正确解出来

日历程序代码我们一般会使用一些js插件来实现了,但是像博客这种日志分类我们会使用php程序来实现,下面一聚教程小编就来为你介绍一下吧。

PHP日历程序,功能都是大众化的,可以下拉切换年月,上一年下一月下一年上一月,太另类的没去写,主要的写出来了,扩展起来就方便多了,标题为什么要叫精美呢,是因自已感觉界面还过得去,哈哈,让大家见笑了,不足之处还请指出。

效果代码如下

简单实用PHP日历程序代码

php日历核心代码

 代码如下 复制代码

<?php
//日历类
class calendar {
    //当前的年
    private $year;
    //当前的月
    private $month;
    //一个月中第一天是星期几
    private $start_weekday;
    //当前月的天数
    private $days;
    //最大数与最小年数,最大与最小月数
    private $yearMonth = array(2080, 1900, 12, 1);
    //构造函数
    function __construct() {
        if (isset($_GET['year'])) {
           $this->year = $_GET['year'];
        }
            if (isset($_GET['month'])) {
            $this->month = $_GET['month'];
        }
        $this->pnYm($this->year, $this->month);
        $this->days = date('t', mktime(0, 0, 0, $this->month, 1, $this->year));
        $this->start_weekday = date('w', mktime(0, 0, 0, $this->month, 1, $this->year));
        $this->style();
    }
    //输出
    private function style() {
        echo '<table id="calendar">';
        $this->weeklist();
        $this->daylist();
        echo '<table>';
    }
    //年月参数判断
    private function ymCheck($year, $month) {
        if (!is_numeric($year)) {
            $year = date('Y');
        }
        if (!is_numeric($month)) {
            $month = date('m');
        }
        if ($month < $this->yearMonth[3]) {
            $month = $this->yearMonth[2];
            $year -= 1;
        }
        if ($month > $this->yearMonth[2]) {
            $month = $this->yearMonth[3];
            $year = intval($year) + 1;
        }
        $year = $year < $this->yearMonth[1] ? $this->yearMonth[1] : $year;
        $year = $year > $this->yearMonth[0] ? $this->yearMonth[0] : $year;
        return array($year, $month);
    }
    //上一年、下一年、上一月、下一月
    private function pnYm($year, $month) {
        $ym = $this->ymCheck($year, $month);
        $this->year = $ym[0];
        $this->month = $ym[1];
    }
    //weeklist周列表
    private function weeklist() {
        $week = array('日','一','二','三','四','五','六');
        echo '<tr>';
        foreach ($week as $val) {
            echo '<th>'.$val.'</th>';
        }
        echo '</tr>';
    }
    //daylist天列表
    private function daylist() {
        //年月日导航
        echo '<tr>';
        echo '<td><a title="上一年" href="?year='.($this->year-1).'&month='.$this->month.'"><<</a></td>';
        echo '<td><a title="上一月" href="?year='.$this->year.'&month='.($this->month-1).'"><</a></td>';
        echo '<td colspan="3">';
        echo '<form action="?" method="get" id="form">';
        echo '<select name="year" onchange="formaction()">';
        for ($i = $this->yearMonth[1]; $i <= $this->yearMonth[0]; $i++) {
             if ($i == $this->year) {
                   echo '<option value="'.$i.'" selected="selected">'.$i.'年</option>';
             }else {
                   echo '<option value="'.$i.'">'.$i.'年</option>';
             }
        }
        echo '</select>';
        echo '<select name="month" onchange="formaction()">';
        for ($i = $this->yearMonth[3]; $i <= $this->yearMonth[2]; $i++) {
            if ($i == $this->month) {
                 echo '<option value="'.$i.'" selected="selected">'.$i.'月</option>';
            }else {
                 echo '<option value="'.$i.'">'.$i.'月</option>';
            }
        }
       echo '</select></form></td>';
       echo '<td><a title="下一月" href="?year='.$this->year.'&month='.($this->month+1).'">></a></td>';
       echo '<td><a title="下一年" href="?year='.($this->year+1).'&month='.$this->month.'">>></a></td>';
       echo '</tr>';

       echo '<tr>';
       //输出空格(当前一个月第一天前面要空出来的)
       for($i = 0; $i < $this->start_weekday; $i++) {
             echo '<td>&nbsp;</td>';
       }
       for ($k = 1; $k <= $this->days; $k++) {
            $i++;
            if ($k == date('d')) {
                  echo '<td>'.$k.'</td>';
            }else {
                  echo '<td>'.$k.'</td>';
            }
            if ($i % 7 == 0) {
                 if ($k != $this->days) {
                        echo '</tr><tr>';
                 }
            }
        }
         echo '</tr>';
    }
}
?>

html+css代码

 代码如下 复制代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP日历程序</title>
<style>
#calendar { width:auto; margin:0 auto; margin-top:100px; border:0; border-collapse:collapse; box-shadow:0px 0px 4px #ddd; font-size:12px; text-align:center; font-family:"微软雅黑"; color:#333; border:solid 1px #c5e2ff; }
#calendar tr { width:auto; height:34px; line-height:34px; }
#calendar tr th { width:44px; background:#c5e2ff; }
#calendar tr td { background:#fff; }
#calendar tr td.tdbg { background:#c5e2ff; }
#calendar tr td:hover { background:#FFC; }
#calendar tr td a { text-decoration:none; color:#f50; font-weight:900; }
#calendar select { width:auto; border:solid 1px #c5c5c5; padding:2px 0 2px 0; background:#fff; float:left; margin-left:5px; }
</style>
<script>
function formaction() {
    var form = document.getElementById('form');
    form.submit();
}
</script>
</head>
<body>
<?php
require 'init.php';
$calendar = new calendar();
?>
</body>
</html>

unlink在php中是删除文件如果单文件删除我们直接使用unlink就可以了,如果是目录中的删除我们需要遍历目录进入递归操作删除了,下面来看一个例子。

在学习本方法之前我们最rmdir();函数,这个函数就是根据指定的文件路劲,删除文件或者是文件夹,但是当删除的是文件夹,并且文件夹里面还有内容的时候,就会出现Directory not empty 的错误,这个怎么来解决呢,现在我们就通过编写一个函数来解决这个问题。

在本实例中使用到了php中比较重要的几个文件操作的函数,
1.opendir:如果该函数成功运行,将返回一组目录流(一组目录字符串),如果失败将返回错误[error]。你可以在函数的最前面加上“@”来隐藏错误。
2.readdir:从目录留里面里面的返回的结果是,首先是一个.(表示这个目录,进入目录开始读取),返回..(表示已经在目录中,正在读取目录中的文件)   然后返回文件或者文件夹的名字,如果没有则返回false
3.closedir:关闭目录流
完整代码:

 代码如下 复制代码

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<?php
function delDirAndFile($dirName,$flag) {
if (@$handle = opendir ( "$dirName" )) {
    //如果该函数成功运行,将返回一组目录流(一组目录字符串),如果失败将返回错误[error]。你可以在函数的最前面加上“@”来隐藏错误。
while ( false!==($item = readdir($handle))) {
//从目录留里面里面的返回的结果是,首先是一个.(表示这个目录,进入目录开始读取),返回..(表示已经在目录中,正在读取目录中的文件)
//然后返回文件或者文件夹的名字,如果没有则返回false
if ($item!= "." && $item != "..") {
//这里是当有文件或者是文件夹的时候开始做出判断
if (is_dir("$dirName/$item" )) {
//如果是文件夹,递归都用
delDirAndFile("$dirName/$item");
} else {
//否则就删除文件
if (unlink ( "$dirName/$item" ))
   //判断文件是不是删除成功了
echo "删除文件 $dirName/$itemn";
}
}
}
closedir ($handle );//关闭文件目录流
if($flag==true){
if (rmdir($dirName ))
echo '目录以及文件删除成功';//最后删除输入的文件夹
}
}
}
?>

<?php
delDirAndFile("dd",false);
?>
</body>
</html>

代码的基本介绍在代码中都有说明,现在我们来看看测试的结果:
执行前的文件结构目录php中删除文件夹以及文件夹中的文件程序代码
执行时页面显示结果:php中删除文件夹以及文件夹中的文件程序代码
执行之后的问价目录结构:php中删除文件夹以及文件夹中的文件程序代码
下面有两种方法实现用户登录了,一个是无数据库直接登录功能,一个是有数据库查询判断登录,后者是我们最常用的管理权限与后台登录功能,希望对各位有帮助哦。

用户登录系统(没数据库)

关键的代码:
在loginUI.php中主要是:
——————————————————————————–

 代码如下 复制代码
<?php
if(error!=null){
$error=$_GET['error'];
echo $error;
echo “登陆失败,请检查您的用户名(yugaga)和密码(123456)”;
}
?>

————————————————————————————
就是在登录失败之后显示一些提示信息
在loginCheck.php中
————————————————————————————–

 代码如下 复制代码
<?php
$username=$_POST['username'];
$password=$_POST['password'];
if($username==”yugaga”&&$password==”123456″){
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), ‘/’);
$extra = ‘welcome.php?user=’.$username;
header(“Location: http://$host$uri/$extra“);
}else {
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), ‘/’);
$extra = ‘loginUI.php?error=failer’;
header(“Location: http://$host$uri/$extra“);
}
?>

———————————————————————————————————-
主要是对提交的信息进行验证,这里面用到了正则匹配,和全局变量
在welcome.php中,主要输出信息
———————————————————————————————————-

 代码如下 复制代码
<?php
$username=$_GET['user'];
echo “欢迎”.$username.”的登陆”;
?>

用户登录系统(有数据库)

我们试着去连接数据库。主要是增添加了两个文件,一个SqlHepler.php,用来获得数据库的连接,一个userService.php文件,用来处理和用户相关的操作,比如用户登录的验证,在本次中,我们只是添加了一个函数checkUserLogin($username,$password),根据用户名和密码判断用户是不是登录成功!~

html 代码

 代码如下 复制代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title>简单的登陆演示 </title>
 </head>

 <body>
 <center>
  <form action="loginCheck.php" method="post">
   用户账号:<input type="text" name="username" size="20"/><br/>
   用户秘密:<input type="password" name="password" size="20"/><br/>
   <input type="submit" value="提交"/>
  </form>
  <?php
 $error=$_GET['error'];
 if($error=='failer'){
  echo "登陆失败,请检查您的用户名(yugaga)和密码(123456)";
 }
?>
  </center>

 </body>
</html>


主要代码:
——————————————————————————————————-
<?php
include_once ‘SqlHelper.php’;
function checkUserLogin($username,$password){
$res=mysql_query(“select *from users where username=’”.$username.”‘”);
if(($listuser=mysql_fetch_array($res))!=null){
if($listuser[2]==$password){
return true;
}
}else {
return false;
}
}
?>
————————————————————————————————————-
SqlHelper的代码:
————————————————————————————————————
<?php
$server=”localhost”;
$user=”root”;
$pass=””;
$con=mysql_connect($server,$user,$pass);
mysql_select_db(“login”,$con);
?>
————————————————
登录成功之后代码

<?php
 $username=$_GET['user'];
 echo "欢迎".$username."的登陆";
?>

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • php把读取xml 文档并转换成json数据代码

    在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04