首頁 後端開發 php教程 php导入csv文件碰到乱码问题的解决方法_php技巧

php导入csv文件碰到乱码问题的解决方法_php技巧

May 17, 2016 am 08:49 AM
亂碼

今天主要是想写一个php导入csv文件的方法,其实网上一搜一大把。都是可以实现怎么去导入的。但是我导入的时候遇到了两个问题,一个是在windows上写代码的时候测试发生了乱码问题,然后解决了。第二个是提交到linux系统上的时候又发生了乱码。我开始还不清楚是乱码的原因,一开始我还以为是代码svn提交发生的错误,到最后我在我的一个群里提问了一下,一朋友是做phpcms的,他说他遇到从Windows提交到Linux的时候刚开始也总是发生错误,后来排查原因就是乱码导致成的。下面切入正题看怎么解决两个问题的吧!

问题一解决:

php读取csv文件,在windows上出现中文读取不到的情况,本人立马想到一个函数mb_convert_encoding();作如下设置 $str = mb_convert_encoding($str, "UTF-8", "GBK");然后就可以了。当然你也可以用iconv();作如下设置iconv(‘GBK',”UTF-8//TRANSLIT//IGNORE”,$str);这两个函数来解决在windows上面发生乱码的问题。

问题二解决:

php读取csv文件,在linux上出现中文读取不到的情况,百度,google后找到解决办法

就是添加了一行代码setlocale(LC_ALL, 'zh_CN');对,亮瞎你的眼了吧。就这么简单,如果你不知道,可能会花很多时间去解决这个问题。
PHP setlocale() 函数解释
定义和用法

setlocale() 函数设置地区信息(地域信息)。

地区信息是针对一个地理区域的语言、货币、时间以及其他信息。该函数返回当前的地区设置,若失败则返回 false。
以下是在资料上收集常用的地区标识:

复制代码 代码如下:

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()这个函数,是因为我导入csv文件到linux系统的时候发生了乱码,包括用了mb_convert_encoding()和iconv()两个函数都是没搞定最后问题的。最后就加了这一句setlocale(LC_ALL, ‘zh_CN');加在导入csv文件开始的代码前面就轻松搞定了,然后我又找了一下资料,发现fgetcsv()函数对区域设置是敏感的。比如说 LANG 设为 en_US.UTF-8 的话,单字节编码的文件就会出现读取错误,所以我们需要对其进行区域性的设置。特分享给大家。

我还尝试用了以下代码也没能搞定,这些都是生成csv文件的header的设置。可能在我这里不起作用,但是在你那里也说不定哦。所以我都整理出来,尽可能的帮助遇到导入csv文件乱码的同行,因为在没办法的情况下真的太难处理了。大家可以都试试!总有一个是属于你的。

复制代码 代码如下:

$csvContent="csvzero,csvone,csvtwo,csvthree,csvfour,csvfive";
header("Content-Type: application/vnd.ms-excel; charset=GB2312");
header("Pragma: public");
header("Expires: 0");
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数据.csv ");
header("Content-Transfer-Encoding: binary ");
$csvContent = iconv("utf-8","gb2312",$csvContent);
echo $csvContent;
exit;
?>

下面就再来具体看看php导入csv文件的代码:

两个函数简单介绍一下,

mb_detect_encoding()检测到的字符编码,或者无法检测指定字符串的编码时返回FALSE。

fgetcsv() 函数从文件指针中读入一行并解析 CSV 字段。与fgets() 类似,不同的是 fgetcsv() 解析读入的行并找出 CSV 格式的字段,然后返回一个包含这些字段的数组。fgetcsv() 出错时返回 FALSE,包括碰到文件结束时。

注释:从 PHP 4.3.5 起,fgetcsv() 的操作是二进制安全的。

注释:CSV 文件中的空行将被返回为一个包含有单个 null 字段的数组,不会被当成错误。

注释:该函数对区域设置是敏感的。比如说 LANG 设为 en_US.UTF-8 的话,单字节编码的文件就会出现读取错误。

注释:如果碰到 PHP 在读取文件时不能识别 Macintosh 文件的行结束符,可以激活 auto_detect_line_endings 运行时配置选项。
复制代码 代码如下:

setlocale(LC_ALL, 'zh_CN'); //设置地区信息(地域信息)
$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;
}
$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,转换为utf-8
$sy .= $str; //我这里做的比较复杂,是用'|'将csv文件里面的内容用'|'全部拼起来,因为我导入的是商品信息,需要根据用户需
//要导入的数据去定义哪些数据是需要导入的。
}
}
if ($sy) { $sy = rtrim($sy, '|'); }
$arr = explode('|',$sy);
$key = array_slice($arr,0,$num); //这个数组就是csv文件里面标题,就是商品id,标题,卖点等等的数据
$skey = array();
$length = array();
$co = count($arr);
$p = $co/$num; //求出要取出的数据的长度
for($j=0;$j$offset=($j-1)*$num; //偏移量,就像分页一样,我这里根据偏移量取出的一个数组就是一个商品的信息。
if($j==0){
$length[] = array_slice($arr,0,$num);
}else{
$length[] = array_slice($arr,$num+$offset,$num);//取出有哪些字段和商品
}
}
$arrtitle = array();
$arrfileds = array();
$arrtagname = DB::select('字段标识', '字段名称')->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//这里就是根据自己的需求查出自己需要的数据,通过用户需要的商品字段标识查出表里相对应的英文标识。
$skey[]= DB::select('字段标识')->from('字段表')->where('字段名称', '=', $arrtitle[$p])->fetch_row();
$rows .= $skey[$p]['字段标识'].'|';
}
if($rows){ $rows = rtrim($rows,'|'); }
if(!empty($rows)){ $exrows = explode('|',$rows); }else{ $exrows = array(); }
$skeys = array_merge($order,$exrows);
$count1 = count($skeys); //字段的个数
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); //如果两个数组是相等的我就合并数组,并把导入csv里面的日期改为时间戳存储到数据库
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导入处理,可能和你的导入方式不同,但是部分代码总会对你有帮助!
以下是简单导入:
复制代码 代码如下:


导入模板



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

$file = $_FILES['csv_goods'];

$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;
}

$row = 0;
while ($data = fgetcsv($handle,1000,',')){
//echo "$row"; //可以知道总共有多少行
$row++;
if ($row == 1)
continue;
$num = count($data);
// 这里会依次输出每行当中每个单元格的数据
for ($i=0; $iecho $data[$i]."
";
// 在这里对数据进行处理
}
}

fclose($handle);
}

?>
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

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整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

word頁碼亂碼怎麼解決 word頁碼亂碼怎麼解決 Jun 25, 2023 pm 03:23 PM

word頁碼亂碼的解決方法:1、開啟word文檔,點選左上角的「文件」選項;2、選擇「更多」選項,再點選「選項」按鈕;3、在word選項中選擇「進階」;4 、在“顯示文件內容”中找到“顯示域代碼而非域值”,去掉前方的勾選,並點擊確定,回到主頁即可。

Linux中文亂碼怎麼解決 Linux中文亂碼怎麼解決 Feb 21, 2024 am 10:48 AM

Linux中文亂碼問題是使用中文字元集和編碼時常見的一個問題。出現亂碼的原因可能是檔案編碼設定不正確,系統語言環境未安裝或未設置,以及終端顯示設定錯誤等。本文將介紹幾種常見的解決方法,並提供具體的程式碼範例。一、檢查檔案編碼設定使用file指令查看檔案編碼在終端機中使用file指令,可以檢視檔案的編碼:file-ifilename如果輸出中有"charset

tomcat啟動亂碼如何解決 tomcat啟動亂碼如何解決 Dec 26, 2023 pm 05:21 PM

tomcat啟動亂碼的解決方法:1、修改Tomcat的conf設定檔;2、修改系統語言;3、修改命令列視窗編碼;4、檢查Tomcat伺服器設定;5、檢查項目編碼;6、檢查日誌檔;7 、嘗試其他解決方案。詳細介紹:1、修改Tomcat的conf設定文件,開啟Tomcat的conf目錄,找到"logging.properties"檔案等等。

解決Windows10中文亂碼問題的方法 解決Windows10中文亂碼問題的方法 Jan 16, 2024 pm 02:21 PM

在Windows10系統中,出現亂碼現象可謂司空見慣。這背後的原因往往在於該作業系統並未對部分字元集提供預設的支持,抑或是設定的字元集選項有錯誤。為了對症下藥,以下我們將為您詳細解析實際的操作規程。 windows10亂碼怎麼解決1、開啟設置,找到「時間和語言」2、再找到「語言」3、找到「管理語言設定」4、點選這裡的「更改系統區域設定」5、如圖勾選上然後點擊確定就可以了。

linux tty中文亂碼怎麼辦 linux tty中文亂碼怎麼辦 Mar 16, 2023 am 09:20 AM

linux tty中文亂碼的解決方法:1、透過「sudo apt-get install fbterm」指令下載字型fbterm;2、執行「sudo fbterm」指令;3、變更字型和字型大小為「font-names=Ubuntu Mono font- size=14”即可。

win11系統文件出現亂碼怎麼解決 win11系統文件出現亂碼怎麼解決 Jun 29, 2023 pm 06:29 PM

win11文字文檔亂碼怎麼解決?許多使用者在使用win11系統的時候出現了文本文檔亂碼的情況而導致無法正常的進行閱讀,出現這個問題很多小伙伴都不知道該如何解決。其實這個方法並不難,下面小編整理了windows11系統文件亂碼解決步驟,希望能帶給大家一點啟發! windows11系統文件亂碼解決步驟1、首先,開啟win11的控制面板,在下面的搜尋框中輸入控制面板,點選搜索,進入控制面板。 2.進入面板後,找到時鐘和區域並點選進入,再點選區域選項。 3.進入後,點選管理面板,再點選更改系統區域設定。

filezilla亂碼怎麼解決 filezilla亂碼怎麼解決 Nov 20, 2023 am 10:16 AM

filezilla亂碼的解決方法有:1、檢查編碼設定;2、檢查檔案本身;3、檢查伺服器設定;4、嘗試其他傳輸工具;5、更新軟體版本;6、檢查網路問題;7、尋求技術支援。解決FileZilla亂碼問題需要從多個方面入手,逐步排除問題原因,並採取相應的措施進行修復。

解決dll檔案開啟亂碼問題的編輯方式 解決dll檔案開啟亂碼問題的編輯方式 Jan 06, 2024 pm 07:53 PM

有很多的用戶在使用電腦的時候,會發現有很多的文件的尾綴是dll,但是很多的用戶們都不知道這種文件需要怎麼打開,想要知道的用戶們快來看看以下詳細教程吧~dll檔案怎麼打開編輯:1、下載一個​​叫做「exescope」的軟體,並下載安裝。 2、然後右鍵dll文件,選擇「用exescope編輯資源」。 3、然後在彈出的錯誤提示框中,點選「確定」。 4、然後在右邊的面板上,點擊每個組前面的「+」號可以查看到它所包含的內容。 5.點選需要檢視的dll文件,就能夠看到了,然後點選“文件”,選擇“匯出”。 6、然後就能夠

See all articles