ホームページ >バックエンド開発 >PHPチュートリアル >CSVファイルをPHP_PHPにインポートする際に文字化けが発生する問題を解決する方法_PHPチュートリアル

CSVファイルをPHP_PHPにインポートする際に文字化けが発生する問題を解決する方法_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:39:141017ブラウズ

今日は主に、php に csv ファイルをインポートする方法を書きたいと思います。すべてインポート方法で実装できます。しかし、インポート時に 2 つの問題が発生しました。1 つは、Windows でコードを書くときにテストで文字化けが発生するという問題でしたが、それは解決されました。 2つ目は、Linuxシステムに送信したところ、また文字化けが発生したことです。最初はコードが文字化けする理由がわかりませんでしたが、最初はコードの svn 送信のエラーだと思いました。結局、私の友人が phpcms で働いているのに質問しました。 Linux に送信すると必ずエラーが発生するが、後で原因が文字化けであることが判明したとのこと。早速本題に入り、これら 2 つの問題を解決する方法を見てみましょう。

問題は解決されました:

PHP は csv ファイルを読み取りますが、Windows では中国語を読み取ることができません。私はすぐに次の設定を行う関数 mb_convert_encoding() を思いつきました。 $str = mb_convert_encoding($str, "UTF-8) "、"GBK"); それで終わりです。もちろん、次のように iconv(); を使用して iconv('GBK', "UTF-8//TRANSLIT//IGNORE", $str); を使用することもできます。これらの 2 つの関数は Windows での文字化けの問題を解決します。 。

2 番目の問題の解決策:

PHP は csv ファイルを読み取りますが、Linux では中国語を読み取ることができません。Baidu と Google の後で解決策を見つけました。それは、setlocale(LC_ALL, 'zh_CN') というコード行を追加することです。 ); はい、目がくらんでしまいます。非常に簡単なので、知らなかった場合は、理解するのに多くの時間を費やすことができます。
PHP setlocale()関数解説
定義と使い方

setlocale()関数は地域情報(地域情報)を設定します。

地域情報は、地理的エリアの言語、通貨、時間、その他の情報です。この関数は現在のロケールを返すか、失敗した場合は false を返します。
以下はデータ収集に一般的に使用される領域識別子です:



コードをコピーします コードは次のとおりです:
zh_CN GB2312
en_US.UTF-8 UTF-8
zh_TW BIG5
zh_HK BIG 5-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() の使用 どちらの関数も最終的な問題を解決できませんでした。最後に、csv ファイルのインポートの先頭にこの文 setlocale(LC_ALL, 'zh_CN'); を追加しました。その後、情報を検索したところ、fgetcsv() 関数が影響を受けやすいことがわかりました。ロケール設定。たとえば、LANG が en_US.UTF-8 に設定されている場合、シングルバイトでエンコードされたファイルは読み取りエラーが発生するため、カルチャを設定する必要があります。特別にみんなと共有します。

次のコードも使用してみましたが、機能しませんでした。これらは CSV ファイルを生成するためのヘッダー設定です。私にはうまくいかないかもしれませんが、あなたにはうまくいくかもしれません。そこで私は、CSV ファイルをインポートするときに文字化けに遭遇した同僚を助けるために、それを整理し、他に方法がない場合に対処するのが非常に困難だったため、最善を尽くしました。誰でも試してみることができます!あなたに属するものは常にあります。



コードをコピーします コードは次のとおりです:
$csvContent="csvzero,csvone,csvtwo,csvthree,csvfour,csvfive"; /vnd.ms -excel; charset=GB2312");
header("Pragma: public");
header("Expires: 0");
header("キャッシュ制御: 必須再検証、事後チェック = 0 、事前チェック =0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type : アプリケーション/ダウンロード") ;
header("Content-Disposition:attachment;filename=CSV data.csv ");
header("Content-Transfer-Encoding:binary ");
$csvContent = iconv("utf-8 ","gb2312", $csvContent);
echo $csvContent;
終了;
?>


CSV ファイルをインポートするための PHP のコードを詳しく見てみましょう:

2 つの関数の簡単な紹介、

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 "";
終了;
$handle = fopen($file['tmp_name'],"r");
$file_encoding = mb_detect_encoding($handle); = 'ASCII'){
echo "";
exit; row = 0;
$sy="";
while ($data = fgetcsv($handle,',')){
if ($row == 0)
続行 ;
$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、タイトル、セールスポイントなどのデータです。
$length = array(); = 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();
$arrtagname = DB::select('フィールド ID', 'フィールド名')-> ; from('フィールドテーブル')->fetch_all();
foreach ($arrtagname として $value) {
$arrfileds[$value['fileds_tags']] = $value['fileds_name']; $fileds as $v)
{
$temarr=explode('-', $v);
if (isset($temarr[0]) && !empty($temarr[0])) {
if (isset ( $temarr[1]) && !empty($temarr[1])) {
if ($temarr[1] == 'ウェンベン') {
$arrtitle[] = $arrfileds[$temarr[0]] '。 Text';
}
} else {
if ($temarr[0] != 'pic') { //フィールドが写真の場合は削除します
$arrtitle[] = $arrfileds[$temarr[0]] ;
}
}
}

$skey = array();
$order[] = 'act_tag' = 'channel_tag'; [] = 'created_time';
$order[] = 'orderby';
$f = $co/$num;//
の項目数を調べます; $p//ここでは、自分のニーズに応じて必要なデータを見つけ、必要な製品フィールドの識別を通じてテーブル内の対応する英語の識別を見つけます。ユーザー。
$skey[]= DB::select('フィールド ID')->from('フィールド テーブル')->where('フィールド名', '=', $arrtitle[$p])-> fetch_row();
$rows .= $skey[$p]['フィールド ID'].'|'
}
if($rows){ $rows = rtrim($rows,'|'); if(!empty($rows)){ $exrows =explode('|',$rows); }else{ $exrows = array(); }
$skeys = array_merge($order,$exrows); = count($skeys); //フィールドの数
if(!empty($length)){
for($x=1;$x$orders = array();
$orders[] = $channel_tag;
$newlen = array_merge($orders, $) length[$x]);
if($count1 !== count($newlen)){ //商品フィールドの長さが商品の長さと異なる場合、ユーザーがフィールドを入力していないことがわかります。
$newrs = array( );
echo "";
exit();
}else{ //start
$arrimport = array_combine($ skeys,$newlen); // 2 つの配列が等しい場合、配列を結合し、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($ armimport['start_time']) && !empty($arrimport['end_time'])){
$newrs=array_merge($arrimport,$arrtime)
}else{
$newrs = 配列();
echo "< ;script type="text/javascript">alert("".'「.($x-1).」項目を確認してください。 「インポートに失敗しました!」 '.""); ";
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 "