現在の位置: ホーム> 最新記事一覧> FGETCSVを使用してCSVファイルを読み取る場合はどうすればよいですか?コーディングの問題に対する詳細な解決策

FGETCSVを使用してCSVファイルを読み取る場合はどうすればよいですか?コーディングの問題に対する詳細な解決策

gitbox 2025-06-08

1. FGETCSVを使用しているときに、なぜCarled Codeが表示されるのですか?

FGETCSV()は、PHPによって提供される便利な機能であり、行ごとにCSVファイルを読み取り、各ラインを配列として返します。ただし、自動的にトランスコードされません。 GBKまたはBig5エンコードで保存されたファイルを読み取ろうとし、PHP環境またはWebページの出力がUTF-8である場合、出力は文字化けされます。


2。文字化けコードの問題を解決するコア:トランスコーディング

文字化けの問題を解決するには、読んだ後、元のエンコードからターゲットエンコード(通常はUTF-8)にデータの各行を変換する必要があります。これは通常、PHPのMB_CONVERT_ENCODING()またはICONV()関数によって達成されます。


3.完全なコードの例

UTF-8として正しく表示したいGBKエンコードCSVファイルがあるとします。次のコードを使用できます。

<code> <?php

$ filename = "data.csv"; // CSVファイルがGBKエンコードされていると仮定します
$ handle = fopen($ filename、 "r");

if($ handle!== false){
while(($ data = fgetcsv($ handle))!== false){
//各列をGBKからUTF-8に変換します
foreach($ data as&$ field){
$ field = mb_convert_encoding($ field、 "utf-8"、 "gbk");
}
Unset($ field); //引用の問題を避けてください

    print_r($data); // トランスコードされたコンテンツを出力します
}
fclose($handle);

} それ以外 {
echo「ファイルを開くことはできません:$ filename」;
}

?>
</code>


4。自動検出とコーディング(高度なプラクティス)

ファイルの元のエンコードが何であるかわからない場合は、 mb_detect_encoding()を使用して自動的に検出できます。

<code> <?php

$ filename = "data.csv";
$ handle = fopen($ filename、 "r");

if($ handle!== false){
$ firstline = fgets($ handle);
Rewind($ handle); //最初の行を読んだ後、ポインターはファイルの先頭に戻ります
$ encoding = mb_detect_encoding($ firstline、["gbk"、 "utf-8"、 "big5"、 "sjis"]、true);
if(!$ encoding){
$ encoding = "gbk"; //検出できない場合、GBKはデフォルトで使用されます
}

 while (($data = fgetcsv($handle)) !== false) {
    foreach ($data as &$field) {
        $field = mb_convert_encoding($field, "UTF-8", $encoding);
    }
    unset($field);
    print_r($data);
}
fclose($handle);

} それ以外 {
エコー「ファイルは開くことができません」;
}

?>
</code>


5. CSVがブラウザを介してアップロードされた場合はどうなりますか?

ユーザーによってアップロードされたCSVファイルは、異なるオペレーティングシステム(Windows、Mac、Linux)から来る場合がある場合、または異なるソフトウェア(Excel、WPS)によって保存される場合がある場合、現時点ではキャラクターエンコーディングはさらに制御できません。アップロード後に均一にエンコードを処理し、 FGETCSV()で読み取ることをお勧めします。

アップロードされたCSVファイルを一時ファイルとして保存し、統合処理のために上記の自動検出 +トランスコーディングメソッドを使用することを検討できます。

<code> <?php

if(isset($ _ files ['csvfile'])&& $ _files ['csvfile'] ['error'] === upload_err_ok){
$ tmpfile = $ _files ['csvfile'] ['tmp_name'];
$ handle = fopen($ tmpfile、 "r");

 if ($handle !== false) {
    $firstLine = fgets($handle);
    rewind($handle);
    $encoding = mb_detect_encoding($firstLine, ["GBK", "UTF-8", "BIG5", "SJIS"], true);
    if (!$encoding) {
        $encoding = "GBK";
    }

    while (($data = fgetcsv($handle)) !== false) {
        foreach ($data as &$field) {
            $field = mb_convert_encoding($field, "UTF-8", $encoding);
        }
        unset($field);
        print_r($data);
    }
    fclose($handle);
} else {
    echo "アップロードされたファイルを読み取ることができません";
}

} それ以外 {
エコー「failedまたはfile invalidのアップロード」;
}

?>
</code>