1. 程式人生 > >PHP導入文件的轉碼問題

PHP導入文件的轉碼問題

麻煩 文件 file 時間格式 icon nbsp 常見 之前 date

今天在公司的做的後天項目出現點問題,本以為全開發完了,但是在聯調的過程中我發現了很嚴重的問題,這個問題困擾了我好久,後來才知道原因,歸根結底就是經驗不足,以前做過,踩過坑就好了。

我導出的文件是csv格式的,有的同學就會問為什麽不是excel格式的,emmmm,我的導師跟我說csv文件比較小,而且是以逗號分隔的,用記事本就可以打開,比較好處理。我做的後臺也需要導入功能,導入的也是csv文件,如果要導入execl文件的話會很麻煩,需要用到一個插件,而且excel處理速度比加慢,幸好我們的庫裏有封裝好的。我的bug出現在導出文件如果不許改可以正常導入,但是一經修改再次導入的話就會出現亂碼,後來才發現是Excel或wps自動把文件轉碼了,轉成了GBK碼,而我需要的是UTF-8的,這時就需要先把接收的文件轉碼了。

常見的轉碼方式:

1.iconv — 字符串按要求的字符編碼來轉換
iconv有bug ,碰到一些生僻字就會無法轉換,當然了配置第二個參數時,可以稍微彌補一下默認缺陷,不至於無法轉換是截斷,用法如下
iconv(“UTF-8″,”GB2312//IGNORE”,$data) ;

2.mb_convert_encoding詳解:
為了確保轉換的成功率,我們可以用另一個轉換函數
mb_convert_encoding,這個函數效率不是很高,另外這個函數還可以省略第三個參數,自動識別內容編碼,不過最好不要用,影響效率,還需要註意的時,mb_convert_encoding和iconv參數順序不一樣,一定要註意。$outstr = mb_convert_encoding($instr,‘UTF-8‘,‘GBK‘);   

3.mb_detect_encoding詳解:

mb_detect_encoding — 檢測字符的編碼

4.將任意碼轉換成utf

1 private function characet($data){
2         if( !empty($data) ){
3             $fileType = mb_detect_encoding($data , array(‘UTF-8‘,‘GBK‘,‘LATIN1‘,‘BIG5‘,‘ASCII‘,‘GB2312‘)) ;
4             if( $fileType != ‘UTF-8‘){
5                 $data
= mb_convert_encoding($data ,‘utf-8‘ , $fileType); 6 } 7 } 8 return $data; 9 }

註意:一定要在用字符串分割函數之前就行轉碼。

我還遇到時間格式的問題,同樣是csv和excel的坑,導出的時間格式是1978-12-23 08:08:08 ,但是給我轉碼成了1978/12/23 8:08:08 ,這問題的解決辦法就是把前端給的參數用函數strtotime轉換成時間戳,再用date函數轉換成想要的格式就好了,很坑吧。。。。。

今天很煩。。。。。。

PHP導入文件的轉碼問題