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

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

WBOY
リリース: 2016-07-13 10:39:22
オリジナル
750 人が閲覧しました

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

問題 1 が解決されました:

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

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

$csvContent="csvzero,csvone,csvtwo,csvthree,csvfour,csvfive";
header("Content-Type: application/vnd.ms-excel; charset=GB2312"); : public");
header("有効期限: 0"); www.jbxue.com
header("キャッシュ制御: 必須再検証、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-Type: application/octet-stream")性質:attachment;filename=CSV data.csv ");
header("Content-Transfer-Encoding: binary ");
$csvContent = iconv("utf-8","gb2312",$csvContent);
echo $ csvコンテンツ;
?>
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);
if ($file_encoding != ' ASCII'){
echo "";
exit; .com
$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';
$order[] = 'created_time'; ] = 'orderby';
$rows ='';
$f = $co/$num;//
for($p=0;$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 "

人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート