FGETCSV()は、PHPによって提供される便利な機能であり、行ごとにCSVファイルを読み取り、各ラインを配列として返します。ただし、自動的にトランスコードされません。 GBKまたはBig5エンコードで保存されたファイルを読み取ろうとし、PHP環境またはWebページの出力がUTF-8である場合、出力は文字化けされます。
文字化けの問題を解決するには、読んだ後、元のエンコードからターゲットエンコード(通常はUTF-8)にデータの各行を変換する必要があります。これは通常、PHPのMB_CONVERT_ENCODING()またはICONV()関数によって達成されます。
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>
ファイルの元のエンコードが何であるかわからない場合は、 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>
ユーザーによってアップロードされた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>