php获取csv文件乱码,php使用fgetcsv读取csv文件乱码解决方法
在php中碰到亂碼多半是編碼問題了,在這里我們分析了很久得出了下面fgetcsv讀取csv文件亂碼原因所在與解決辦法。
例子
代碼如下
復制代碼
function get_csv_contents( $file_target ){
$handle? = fopen( $file_target, 'r');
while ($data = fgetcsv($handle, 1000, ",")) {
$num = count($data);
echo "
$num fields in line $row:
n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c]. "
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魅族專題頁的抓取,然后想著自動下單購買,尼瑪,算了,太多了,寫到判斷是否開始了,商品價格進行了變化,后邊工程量有點大就懶的寫了,如果要完善的話就需要寫模擬登陸(這個不難)加入購物車,下單,下單的時候判斷一下價格,如果價格個官方優惠價格相同就下單,不同就接著去抓。算了,懶的寫了。下邊是部分代碼
代碼如下
復制代碼
$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('/
$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日歷核心代碼
代碼如下
復制代碼
//日歷類
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 '
$this->weeklist();
$this->daylist();
echo '
}
//年月參數判斷
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 '
';foreach ($week as $val) {
echo '
'.$val.'';}
echo '
';}
//daylist天列表
private function daylist() {
//年月日導航
echo '
';echo '
<<';echo '
<';echo '
';echo '
';echo '';
for ($i = $this->yearMonth[1]; $i <= $this->yearMonth[0]; $i++) {
if ($i == $this->year) {
echo ''.$i.'年';
}else {
echo ''.$i.'年';
}
}
echo '';
echo '';
for ($i = $this->yearMonth[3]; $i <= $this->yearMonth[2]; $i++) {
if ($i == $this->month) {
echo ''.$i.'月';
}else {
echo ''.$i.'月';
}
}
echo '
';echo '
>';echo '
>>';echo '
';echo '
';//輸出空格(當前一個月第一天前面要空出來的)
for($i = 0; $i < $this->start_weekday; $i++) {
echo '
?';}
for ($k = 1; $k <= $this->days; $k++) {
$i++;
if ($k == date('d')) {
echo '
'.$k.'';}else {
echo '
'.$k.'';}
if ($i % 7 == 0) {
if ($k != $this->days) {
echo '
';}
}
}
echo '
';}
}
?>
html+css代碼
代碼如下
復制代碼
PHP日歷程序#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; }
function formaction() {
var form = document.getElementById('form');
form.submit();
}
require 'init.php';
$calendar = new calendar();
?>
unlink在php中是刪除文件如果單文件刪除我們直接使用unlink就可以了,如果是目錄中的刪除我們需要遍歷目錄進入遞歸操作刪除了,下面來看一個例子。
在學習本方法之前我們最rmdir();函數,這個函數就是根據指定的文件路勁,刪除文件或者是文件夾,但是當刪除的是文件夾,并且文件夾里面還有內容的時候,就會出現Directory not empty 的錯誤,這個怎么來解決呢,現在我們就通過編寫一個函數來解決這個問題。
在本實例中使用到了php中比較重要的幾個文件操作的函數,
1.opendir:如果該函數成功運行,將返回一組目錄流(一組目錄字符串),如果失敗將返回錯誤[error]。你可以在函數的最前面加上“@”來隱藏錯誤。
2.readdir:從目錄留里面里面的返回的結果是,首先是一個.(表示這個目錄,進入目錄開始讀取),返回..(表示已經在目錄中,正在讀取目錄中的文件)?? 然后返回文件或者文件夾的名字,如果沒有則返回false
3.closedir:關閉目錄流
完整代碼:
代碼如下
復制代碼
Insert title herefunction 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 '目錄以及文件刪除成功';//最后刪除輸入的文件夾
}
}
}
?>
delDirAndFile("dd",false);
?>
代碼的基本介紹在代碼中都有說明,現在我們來看看測試的結果:
執行前的文件結構目錄
執行時頁面顯示結果:
執行之后的問價目錄結構:
下面有兩種方法實現用戶登錄了,一個是無數據庫直接登錄功能,一個是有數據庫查詢判斷登錄,后者是我們最常用的管理權限與后臺登錄功能,希望對各位有幫助哦。
用戶登錄系統(沒數據庫)
關鍵的代碼:
在loginUI.php中主要是:
——————————————————————————–
代碼如下
復制代碼
if(error!=null){
$error=$_GET['error'];
echo $error;
echo “登陸失敗,請檢查您的用戶名(yugaga)和密碼(123456)”;
}
?>
————————————————————————————
就是在登錄失敗之后顯示一些提示信息
在loginCheck.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中,主要輸出信息
———————————————————————————————————-
代碼如下
復制代碼
$username=$_GET['user'];
echo “歡迎”.$username.”的登陸”;
?>
用戶登錄系統(有數據庫)
我們試著去連接數據庫。主要是增添加了兩個文件,一個SqlHepler.php,用來獲得數據庫的連接,一個userService.php文件,用來處理和用戶相關的操作,比如用戶登錄的驗證,在本次中,我們只是添加了一個函數checkUserLogin($username,$password),根據用戶名和密碼判斷用戶是不是登錄成功!~
html 代碼
代碼如下
復制代碼
簡單的登陸演示用戶賬號:
用戶秘密:
$error=$_GET['error'];
if($error=='failer'){
echo "登陸失敗,請檢查您的用戶名(yugaga)和密碼(123456)";
}
?>
主要代碼:
——————————————————————————————————-
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的代碼:
————————————————————————————————————
$server=”localhost”;
$user=”root”;
$pass=””;
$con=mysql_connect($server,$user,$pass);
mysql_select_db(“login”,$con);
?>
————————————————
登錄成功之后代碼
$username=$_GET['user'];
echo "歡迎".$username."的登陸";
?>
總結
以上是生活随笔為你收集整理的php获取csv文件乱码,php使用fgetcsv读取csv文件乱码解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mpvue 中使用 wx-f2 tool
- 下一篇: 推自己的镜像到网易云