国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 php教程 php手冊 php導(dǎo)入csv文件亂碼問題怎么解決

php導(dǎo)入csv文件亂碼問題怎么解決

Jun 13, 2016 am 09:43 AM
aspnet 軟體程式設(shè)計

想寫一個php導(dǎo)入csv文件的方法,都是可以實現(xiàn)怎么去導(dǎo)入的。
但是我導(dǎo)入時遇到了兩個問題,一個是在windows上寫代碼的時候測試發(fā)生了亂碼問題,然后解決了。
第二個是提交到linux系統(tǒng)上的時候又發(fā)生了亂碼。我開始還不清楚是亂碼的原因,一開始我還以為是代碼svn提交發(fā)生的錯誤,到最后我在我的一個群里提問了一下,一朋友是做phpcms的,他說他遇到從Windows提交到Linux的時候剛開始也總是發(fā)生錯誤,后來排查原因就是亂碼導(dǎo)致成的。下面切入正題看怎么解決兩個問題的吧!

問題一解決:

php讀取csv文件,在windows上出現(xiàn)中文讀取不到的情況,本人立馬想到一個函數(shù)mb_convert_encoding();作如下設(shè)置 $str = mb_convert_encoding($str, "UTF-8", "GBK");然后就可以了。當(dāng)然你也可以用iconv();作如下設(shè)置iconv(‘GBK',”UTF-8//TRANSLIT//IGNORE”,$str);這兩個函數(shù)來解決在windows上面發(fā)生亂碼的問題。

問題二解決:

php讀取csv文件,在linux上出現(xiàn)中文讀取不到的情況,百度,google后找到解決辦法

就是添加了一行代碼setlocale(LC_ALL, 'zh_CN');對,亮瞎你的眼了吧。就這么簡單,如果你不知道,可能會花很多時間去解決這個問題。
PHP setlocale() 函數(shù)解釋
定義和用法

setlocale() 函數(shù)設(shè)置地區(qū)信息(地域信息)。

地區(qū)信息是針對一個地理區(qū)域的語言、貨幣、時間以及其他信息。該函數(shù)返回當(dāng)前的地區(qū)設(shè)置,若失敗則返回 false。
以下是在資料上收集常用的地區(qū)標(biāo)識:
zh_CN GB2312
en_US.UTF-8 UTF-8
zh_TW BIG5
zh_HK BIG5-HKSCS
zh_TW.EUC-TW EUC-TW
zh_TW.UTF-8 UTF-8
zh_HK.UTF-8 UTF-8
zh_CN.GBK GBK

例如、
utf-8: setlocale(LC_ALL, ‘en_US.UTF-8′);
簡體:setlocale(LC_ALL, ‘zh_CN');

之所以給大家講 setlocale()這個函數(shù),是因為我導(dǎo)入csv文件到linux系統(tǒng)的時候發(fā)生了亂碼,包括用了mb_convert_encoding()和iconv()兩個函數(shù)都是沒搞定最后問題的。最后就加了這一句setlocale(LC_ALL, ‘zh_CN');加在導(dǎo)入csv文件開始的代碼前面就輕松搞定了,然后我又找了一下資料,發(fā)現(xiàn)fgetcsv()函數(shù)對區(qū)域設(shè)置是敏感的。比如說 LANG 設(shè)為 en_US.UTF-8 的話,單字節(jié)編碼的文件就會出現(xiàn)讀取錯誤,所以我們需要對其進行區(qū)域性的設(shè)置。特分享給大家。

還嘗試用了以下代碼也沒能搞定,這些都是生成csv文件的header的設(shè)置??赡茉谖疫@里不起作用,但是在你那里也說不定哦。所以我都整理出來,盡可能的幫助遇到導(dǎo)入csv文件亂碼的同行,因為在沒辦法的情況下真的太難處理了。大家可以都試試!總有一個是屬于你的。
$csvContent="csvzero,csvone,csvtwo,csvthree,csvfour,csvfive";
header("Content-Type: application/vnd.ms-excel; charset=GB2312");
header("Pragma: public");
header("Expires: 0"); www.jbxue.com
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment;filename=CSV數(shù)據(jù).csv ");
header("Content-Transfer-Encoding: binary ");
$csvContent = iconv("utf-8","gb2312",$csvContent);
echo $csvContent;
exit;
?>

具體看看php導(dǎo)入csv文件的代碼:

兩個函數(shù)簡單介紹一下,

mb_detect_encoding()檢測到的字符編碼,或者無法檢測指定字符串的編碼時返回FALSE。

fgetcsv() 函數(shù)從文件指針中讀入一行并解析 CSV 字段。與fgets() 類似,不同的是 fgetcsv() 解析讀入的行并找出 CSV 格式的字段,然后返回一個包含這些字段的數(shù)組。fgetcsv() 出錯時返回 FALSE,包括碰到文件結(jié)束時。

注釋:從 PHP 4.3.5 起,fgetcsv() 的操作是二進制安全的。

注釋:CSV 文件中的空行將被返回為一個包含有單個 null 字段的數(shù)組,不會被當(dāng)成錯誤。

注釋:該函數(shù)對區(qū)域設(shè)置是敏感的。比如說 LANG 設(shè)為 en_US.UTF-8 的話,單字節(jié)編碼的文件就會出現(xiàn)讀取錯誤。

注釋:如果碰到 PHP 在讀取文件時不能識別 Macintosh 文件的行結(jié)束符,可以激活 auto_detect_line_endings 運行時配置選項。
setlocale(LC_ALL, 'zh_CN'); //設(shè)置地區(qū)信息(地域信息)
$file = $_FILES['files'];
$file_type = substr(strstr($file['name'],'.'),1);
if ($file_type != 'csv'){
echo "";
exit;
}
$handle = fopen($file['tmp_name'],"r");
$file_encoding = mb_detect_encoding($handle);
if ($file_encoding != 'ASCII'){
echo "";
exit;
} www.jbxue.com
$row = 0;
$str="";
$sy="";
while ($data = fgetcsv($handle,1000,',')){
$row++;
if ($row == 0)
continue;
$num = count($data);
for ($i=0; $i$str = (string)$data[$i].'|';
$str = mb_convert_encoding($str, "UTF-8", "GBK"); //已知源碼為GBK,轉(zhuǎn)換為utf-8
$sy .= $str; //我這里做的比較復(fù)雜,是用'|'將csv文件里面的內(nèi)容用'|'全部拼起來,因為我導(dǎo)入的是商品信息,需要根據(jù)用戶需
//要導(dǎo)入的數(shù)據(jù)去定義哪些數(shù)據(jù)是需要導(dǎo)入的。
}
}
if ($sy) { $sy = rtrim($sy, '|'); }
$arr = explode('|',$sy);
$key = array_slice($arr,0,$num); //這個數(shù)組就是csv文件里面標(biāo)題,就是商品id,標(biāo)題,賣點等等的數(shù)據(jù)
$skey = array();
$length = array();
$co = count($arr);
$p = $co/$num; //求出要取出的數(shù)據(jù)的長度
for($j=0;$j$offset=($j-1)*$num; //偏移量,就像分頁一樣,我這里根據(jù)偏移量取出的一個數(shù)組就是一個商品的信息。
if($j==0){
$length[] = array_slice($arr,0,$num);
}else{
$length[] = array_slice($arr,$num+$offset,$num);//取出有哪些字段和商品
}
}
$arrtitle = array();
$arrfileds = array();
$arrtagname = DB::select('字段標(biāo)識', '字段名稱')->from('字段表')->fetch_all();
foreach ($arrtagname as $value) {
$arrfileds[$value['fileds_tags']] = $value['fileds_name'];
}
foreach ($fileds as $v)
{
$temarr= explode('-', $v);
if (isset($temarr[0]) && !empty($temarr[0])) {
if (isset($temarr[1]) && !empty($temarr[1])) {
if ($temarr[1] == 'wenben') {
$arrtitle[] = $arrfileds[$temarr[0]].'文本';
}
} else {
if ($temarr[0] != 'pic') { //是取出字段是圖片就給去掉
$arrtitle[] = $arrfileds[$temarr[0]];
}
}
}

}

$skey = array();
$order = array();
$order[] = 'act_tag';
$order[] = 'channel_tag';
$order[] = 'created_time';
$order[] = 'orderby';
$rows ='';
$f = $co/$num;//求出有多少件商品
for($p=0;$p//這里就是根據(jù)自己的需求查出自己需要的數(shù)據(jù),通過用戶需要的商品字段標(biāo)識查出表里相對應(yīng)的英文標(biāo)識。
$skey[]= DB::select('字段標(biāo)識')->from('字段表')->where('字段名稱', '=', $arrtitle[$p])->fetch_row();
$rows .= $skey[$p]['字段標(biāo)識'].'|';
}
if($rows){ $rows = rtrim($rows,'|'); }
if(!empty($rows)){ $exrows = explode('|',$rows); }else{ $exrows = array(); }
$skeys = array_merge($order,$exrows);
$count1 = count($skeys); //字段的個數(shù)
if(!empty($length)){
for($x=1;$x$orders = array();
$orders[] = $act_tag;
$orders[] = $channel_tag;
$orders[] = time();
$newlen = array_merge($orders,$length[$x]);
if($count1 !== count($newlen)){ //如果商品字段的長度和商品的長度不等就證明用戶有哪個字段沒錄入
$newrs = array();
echo "";
fclose($handle);
exit();
}else{ //start
$arrimport = array_combine($skeys,$newlen); //如果兩個數(shù)組是相等的我就合并數(shù)組,并把導(dǎo)入csv里面的日期改為時間戳存儲到數(shù)據(jù)庫
if(!empty($arrimport['start_time'])){ $sta = strtotime($arrimport['start_time']); }else{ $sta=(int)0; }
if(!empty($arrimport['end_time'])){ $end = strtotime($arrimport['end_time']); }else{ $end=(int)0; }
$arrtime=array('start_time'=>$sta,'end_time'=>$end);
if(!empty($arrimport['start_time']) && !empty($arrimport['end_time'])){
$newrs=array_merge($arrimport,$arrtime);
}else{
$newrs = array();
echo "";
fclose($handle);
exit();
}
if(count($skeys) == count($newrs)){
DB::insert('商品表', array_values($skeys))
->values(array_values($newrs))
->execute();
}
} //end
}
}
if($row-1==(int)0){
echo "";
}else{
echo "

以上是我工作需要所做的csv導(dǎo)入處理,可能和你的導(dǎo)入方式不同!
簡單導(dǎo)入:


導(dǎo)入模板



if (isset($_POST['import'])){

$file = $_FILES['csv_goods'];

$file_type = substr(strstr($file['name'],'.'),1);

// 檢查文件格式
if ($file_type != 'csv'){
echo '文件格式不對,請重新上傳!';
exit;
} www.jbxue.com
$handle = fopen($file['tmp_name'],"r");
$file_encoding = mb_detect_encoding($handle);

// 檢查文件編碼
if ($file_encoding != 'ASCII'){
echo '文件編碼錯誤,請重新上傳!';
exit;
}

$row = 0;
while ($data = fgetcsv($handle,1000,',')){
//echo "$row"; //可以知道總共有多少行
$row++;
if ($row == 1)
continue;
$num = count($data);
// 這里會依次輸出每行當(dāng)中每個單元格的數(shù)據(jù)
for ($i=0; $iecho $data[$i]."
";
// 在這里對數(shù)據(jù)進行處理
}
}

fclose($handle);
}

?>

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在ASP.NET程式中重連MySQL連線? 如何在ASP.NET程式中重連MySQL連線? Jun 29, 2023 pm 02:21 PM

如何在ASP.NET程式中重連MySQL連線?在ASP.NET開發(fā)中,使用MySQL資料庫是非常常見的。然而,由於網(wǎng)路或資料庫伺服器的原因,有時會導(dǎo)致資料庫連線中斷或逾時。在這種情況下,為了確保程式的穩(wěn)定性和可靠性,我們需要在連線中斷後重新建立連線。本文將介紹如何在ASP.NET程式中實作重連MySQL連線的方法。引用必要的命名空間首先,在程式碼檔案的頭部引用

Vue.js與ASP.NET的結(jié)合,實現(xiàn)Web應(yīng)用的效能最佳化與擴充的技巧與建議 Vue.js與ASP.NET的結(jié)合,實現(xiàn)Web應(yīng)用的效能最佳化與擴充的技巧與建議 Jul 29, 2023 pm 05:19 PM

Vue.js與ASP.NET的結(jié)合,實現(xiàn)Web應(yīng)用的效能最佳化和擴展的技巧和建議隨著Web應(yīng)用的快速發(fā)展,效能最佳化成為開發(fā)者不可或缺的重要任務(wù)。 Vue.js作為一個流行的前端框架,與ASP.NET的結(jié)合可以幫助我們實現(xiàn)更好的效能最佳化和擴充。本文將會介紹一些技巧和建議,並提供一些程式碼範(fàn)例。一、減少HTTP請求HTTP請求的數(shù)量直接影響Web應(yīng)用程式的載入速度。透過

生成式AI將在十個方面改變軟體開發(fā) 生成式AI將在十個方面改變軟體開發(fā) Mar 11, 2024 pm 12:10 PM

譯者|陳峻審校|重樓上世紀(jì)90年代,當(dāng)人們提起軟體程式設(shè)計時,通常意味著選擇一個編輯器,將程式碼檢入CVS或SVN程式碼庫,然後將程式碼編譯成可執(zhí)行檔。與之對應(yīng)的Eclipse和VisualStudio等整合開發(fā)環(huán)境(IDE)可以將程式設(shè)計、開發(fā)、文件、建置、測試、部署等步驟納入到一個完整的軟體開發(fā)生命週期(SDLC)中,從而提高了開發(fā)人員的工作效率。近年來,流行的雲(yún)端運算和DevSecOps自動化工具提升了開發(fā)者的綜合能力,使得更多的企業(yè)能夠更輕鬆地開發(fā)、部署和維護軟體應(yīng)用。如今,生成式AI作為下一代開

ASP.NET程式中的MySQL連線池使用及最佳化技巧 ASP.NET程式中的MySQL連線池使用及最佳化技巧 Jun 30, 2023 pm 11:54 PM

如何在ASP.NET程式中正確使用和最佳化MySQL連線池?引言:MySQL是一種廣泛使用的資料庫管理系統(tǒng),它具有高效能、可靠性和易用性的特性。在ASP.NET開發(fā)中,使用MySQL資料庫進行資料儲存是常見的需求。為了提高資料庫連接的效率和效能,我們需要正確地使用和最佳化MySQL連接池。本文將介紹在ASP.NET程式中如何正確使用和最佳化MySQL連接池的方法。

Vue.js與ASP.NET的結(jié)合,實現(xiàn)企業(yè)級應(yīng)用的開發(fā)與部署 Vue.js與ASP.NET的結(jié)合,實現(xiàn)企業(yè)級應(yīng)用的開發(fā)與部署 Jul 29, 2023 pm 02:37 PM

Vue.js與ASP.NET的結(jié)合,實現(xiàn)企業(yè)級應(yīng)用的開發(fā)和部署在當(dāng)今快速發(fā)展的互聯(lián)網(wǎng)技術(shù)領(lǐng)域,企業(yè)級應(yīng)用的開發(fā)和部署變得越來越重要。 Vue.js和ASP.NET是兩個在前端和後端開發(fā)中廣泛使用的技術(shù),將它們結(jié)合起來可以為企業(yè)級應(yīng)用的開發(fā)和部署帶來許多優(yōu)勢。本文將透過程式碼範(fàn)例介紹如何使用Vue.js和ASP.NET進行企業(yè)級應(yīng)用的開發(fā)和部署。首先,我們需要安裝

如何在ASP.NET程式中正確設(shè)定和使用MySQL連線池? 如何在ASP.NET程式中正確設(shè)定和使用MySQL連線池? Jun 29, 2023 pm 12:56 PM

如何在ASP.NET程式中正確設(shè)定和使用MySQL連線池?隨著互聯(lián)網(wǎng)的發(fā)展和資料量的增加,對資料庫的存取和連接需求也不斷增加。為了提高資料庫的效能和穩(wěn)定性,連接池成為了一個必備的技術(shù)。本文主要介紹如何在ASP.NET程式中正確配置和使用MySQL連接池,以提高資料庫的效率和回應(yīng)速度。一、連接池的概念和作用連接池是一種重複使用資料庫連接的技術(shù),在程式初始

使用Visual Studio在Linux上進行ASP.NET開發(fā)的建議配置 使用Visual Studio在Linux上進行ASP.NET開發(fā)的建議配置 Jul 06, 2023 pm 08:45 PM

使用VisualStudio在Linux上進行ASP.NET開發(fā)的建議配置概述:隨著開源軟體的發(fā)展和Linux作業(yè)系統(tǒng)的普及,越來越多的開發(fā)者開始在Linux上進行ASP.NET開發(fā)。而作為一款功能強大的開發(fā)工具,VisualStudio在Windows平臺上一直佔有主導(dǎo)地位。本文將介紹如何在Linux上設(shè)定VisualStudio來進行ASP.NE

ASP.NET中使用並最佳化MySQL連線池的事務(wù)效能 ASP.NET中使用並最佳化MySQL連線池的事務(wù)效能 Jun 30, 2023 pm 12:12 PM

如何在ASP.NET程式中正確使用並最佳化MySQL連線池的事務(wù)效能?在ASP.NET程式中,資料庫事務(wù)是非常重要的一環(huán)。事務(wù)可以確保資料庫的一致性和完整性,同時也可以提供更好的效能。而在使用MySQL資料庫時,利用連線池來管理連線資源和最佳化效能是不可或缺的。首先,讓我們簡單了解一下MySQL連接池的概念。連接池是一組連接的緩衝池,透過預(yù)先初始化一定數(shù)量的數(shù)

See all articles