日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

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

發(fā)布時(shí)間:2023/12/10 php 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php获取csv文件乱码,php使用fgetcsv读取csv文件乱码解决方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在php中碰到亂碼多半是編碼問題了,在這里我們分析了很久得出了下面fgetcsv讀取csv文件亂碼原因所在與解決辦法。

例子

代碼如下

復(fù)制代碼

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);

}

導(dǎo)入的csv文件是以ansi編碼保存的,對(duì)于中文操作系統(tǒng)環(huán)境對(duì)應(yīng)的應(yīng)該就是gbk編碼了,通過手動(dòng)更改瀏覽器字符編碼為gbk,亂碼的情況消失了,于時(shí)進(jìn)行了下面調(diào)整。

代碼如下

復(fù)制代碼

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

$data為需要轉(zhuǎn)換編碼的數(shù)組。

補(bǔ)充:LINUX FGETCSV讀取GBK數(shù)據(jù)亂碼

當(dāng)Linux系統(tǒng)是使用的默認(rèn)設(shè)置,則在該Linux服務(wù)器上對(duì)gbk的csv格式文件進(jìn)行處理的時(shí)候,就會(huì)出現(xiàn)亂碼現(xiàn)象。

解決方法是:

使用 setlocale 函數(shù)設(shè)置環(huán)境變量。比如要設(shè)置使用gb 的區(qū)域設(shè)置可以在fgetcsv前使用下面的語句。

代碼如下

復(fù)制代碼

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

具體使用哪些locale 可以使用linux 命令 locale -a 查看系統(tǒng)支持哪些

curl來抓取網(wǎng)頁內(nèi)容是一個(gè)性能比較好的函數(shù)了,我們通常會(huì)使用它來快速模仿用戶去訪問我們要抓取的網(wǎng)頁了,下面看一個(gè)例子有興趣的朋友可進(jìn)入?yún)⒖肌?/p>

早上想寫了一個(gè)抓取是京東618魅族專題頁的抓取,然后想著自動(dòng)下單購買,尼瑪,算了,太多了,寫到判斷是否開始了,商品價(jià)格進(jìn)行了變化,后邊工程量有點(diǎn)大就懶的寫了,如果要完善的話就需要寫模擬登陸(這個(gè)不難)加入購物車,下單,下單的時(shí)候判斷一下價(jià)格,如果價(jià)格個(gè)官方優(yōu)惠價(jià)格相同就下單,不同就接著去抓。算了,懶的寫了。下邊是部分代碼

代碼如下

復(fù)制代碼

$cookie_file = dirname(__FILE__)."/jd.cookie";

//專題首頁url

$indexurl = 'http://sale.jd.com/act/BOxFsKPGNZwpet4.html';

//獲取專題頁到產(chǎn)品詳情的地址

$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);//設(shè)置頭信息

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抓取的時(shí)候出現(xiàn)亂碼

用站長工具查看我們抓取的網(wǎng)而不是使用了gzip壓縮了,如果有返回"Accept-Encoding:gzip, deflate" 就是打開了gzip了,我們只要如下操作

代碼如下

復(fù)制代碼

$res=curl_exec($ch1);

if(!empty($res)){ //save capcha

echo gzdecode($res);

}

GBK或者UTF8漢字之類的亂碼

代碼如下

復(fù)制代碼

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

我們?cè)O(shè)置頁面為GBK兼容GB2312,GB2312是GBK的子集,所有GB2312編碼的用GBK都能正確解出來

日歷程序代碼我們一般會(huì)使用一些js插件來實(shí)現(xiàn)了,但是像博客這種日志分類我們會(huì)使用php程序來實(shí)現(xiàn),下面一聚教程小編就來為你介紹一下吧。

PHP日歷程序,功能都是大眾化的,可以下拉切換年月,上一年下一月下一年上一月,太另類的沒去寫,主要的寫出來了,擴(kuò)展起來就方便多了,標(biāo)題為什么要叫精美呢,是因自已感覺界面還過得去,哈哈,讓大家見笑了,不足之處還請(qǐng)指出。

效果代碼如下

php日歷核心代碼

代碼如下

復(fù)制代碼

//日歷類

class calendar {

//當(dāng)前的年

private $year;

//當(dāng)前的月

private $month;

//一個(gè)月中第一天是星期幾

private $start_weekday;

//當(dāng)前月的天數(shù)

private $days;

//最大數(shù)與最小年數(shù),最大與最小月數(shù)

private $yearMonth = array(2080, 1900, 12, 1);

//構(gòu)造函數(shù)

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 '

}

//年月參數(shù)判斷

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() {

//年月日導(dǎo)航

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 '

';

//輸出空格(當(dāng)前一個(gè)月第一天前面要空出來的)

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代碼

代碼如下

復(fù)制代碼

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就可以了,如果是目錄中的刪除我們需要遍歷目錄進(jìn)入遞歸操作刪除了,下面來看一個(gè)例子。

在學(xué)習(xí)本方法之前我們最rmdir();函數(shù),這個(gè)函數(shù)就是根據(jù)指定的文件路勁,刪除文件或者是文件夾,但是當(dāng)刪除的是文件夾,并且文件夾里面還有內(nèi)容的時(shí)候,就會(huì)出現(xiàn)Directory not empty 的錯(cuò)誤,這個(gè)怎么來解決呢,現(xiàn)在我們就通過編寫一個(gè)函數(shù)來解決這個(gè)問題。

在本實(shí)例中使用到了php中比較重要的幾個(gè)文件操作的函數(shù),

1.opendir:如果該函數(shù)成功運(yùn)行,將返回一組目錄流(一組目錄字符串),如果失敗將返回錯(cuò)誤[error]。你可以在函數(shù)的最前面加上“@”來隱藏錯(cuò)誤。

2.readdir:從目錄留里面里面的返回的結(jié)果是,首先是一個(gè).(表示這個(gè)目錄,進(jìn)入目錄開始讀取),返回..(表示已經(jīng)在目錄中,正在讀取目錄中的文件)?? 然后返回文件或者文件夾的名字,如果沒有則返回false

3.closedir:關(guān)閉目錄流

完整代碼:

代碼如下

復(fù)制代碼

Insert title here

function delDirAndFile($dirName,$flag) {

if (@$handle = opendir ( "$dirName" )) {

//如果該函數(shù)成功運(yùn)行,將返回一組目錄流(一組目錄字符串),如果失敗將返回錯(cuò)誤[error]。你可以在函數(shù)的最前面加上“@”來隱藏錯(cuò)誤。

while ( false!==($item = readdir($handle))) {

//從目錄留里面里面的返回的結(jié)果是,首先是一個(gè).(表示這個(gè)目錄,進(jìn)入目錄開始讀取),返回..(表示已經(jīng)在目錄中,正在讀取目錄中的文件)

//然后返回文件或者文件夾的名字,如果沒有則返回false

if ($item!= "." && $item != "..") {

//這里是當(dāng)有文件或者是文件夾的時(shí)候開始做出判斷

if (is_dir("$dirName/$item" )) {

//如果是文件夾,遞歸都用

delDirAndFile("$dirName/$item");

} else {

//否則就刪除文件

if (unlink ( "$dirName/$item" ))

//判斷文件是不是刪除成功了

echo "刪除文件 $dirName/$itemn";

}

}

}

closedir ($handle );//關(guān)閉文件目錄流

if($flag==true){

if (rmdir($dirName ))

echo '目錄以及文件刪除成功';//最后刪除輸入的文件夾

}

}

}

?>

delDirAndFile("dd",false);

?>

代碼的基本介紹在代碼中都有說明,現(xiàn)在我們來看看測試的結(jié)果:

執(zhí)行前的文件結(jié)構(gòu)目錄

執(zhí)行時(shí)頁面顯示結(jié)果:

執(zhí)行之后的問價(jià)目錄結(jié)構(gòu):

下面有兩種方法實(shí)現(xiàn)用戶登錄了,一個(gè)是無數(shù)據(jù)庫直接登錄功能,一個(gè)是有數(shù)據(jù)庫查詢判斷登錄,后者是我們最常用的管理權(quán)限與后臺(tái)登錄功能,希望對(duì)各位有幫助哦。

用戶登錄系統(tǒng)(沒數(shù)據(jù)庫)

關(guān)鍵的代碼:

在loginUI.php中主要是:

——————————————————————————–

代碼如下

復(fù)制代碼

if(error!=null){

$error=$_GET['error'];

echo $error;

echo “登陸失敗,請(qǐng)檢查您的用戶名(yugaga)和密碼(123456)”;

}

?>

————————————————————————————

就是在登錄失敗之后顯示一些提示信息

在loginCheck.php中

————————————————————————————–

代碼如下

復(fù)制代碼

$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“);

}

?>

———————————————————————————————————-

主要是對(duì)提交的信息進(jìn)行驗(yàn)證,這里面用到了正則匹配,和全局變量

在welcome.php中,主要輸出信息

———————————————————————————————————-

代碼如下

復(fù)制代碼

$username=$_GET['user'];

echo “歡迎”.$username.”的登陸”;

?>

用戶登錄系統(tǒng)(有數(shù)據(jù)庫)

我們?cè)囍ミB接數(shù)據(jù)庫。主要是增添加了兩個(gè)文件,一個(gè)SqlHepler.php,用來獲得數(shù)據(jù)庫的連接,一個(gè)userService.php文件,用來處理和用戶相關(guān)的操作,比如用戶登錄的驗(yàn)證,在本次中,我們只是添加了一個(gè)函數(shù)checkUserLogin($username,$password),根據(jù)用戶名和密碼判斷用戶是不是登錄成功!~

html 代碼

代碼如下

復(fù)制代碼

簡單的登陸演示

用戶賬號(hào):

用戶秘密:

$error=$_GET['error'];

if($error=='failer'){

echo "登陸失敗,請(qǐng)檢查您的用戶名(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(“l(fā)ogin”,$con);

?>

————————————————

登錄成功之后代碼

$username=$_GET['user'];

echo "歡迎".$username."的登陸";

?>

總結(jié)

以上是生活随笔為你收集整理的php获取csv文件乱码,php使用fgetcsv读取csv文件乱码解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。