206

CSV形式でいくつかのものを出力するだけの非常に単純なものがありますが、UTF-8でなければなりません。このファイルを TextEdit、TextMate、または Dreamweaver で開くと、UTF-8 文字が正しく表示されますが、Excel で開くと、このばかげたことを代わりに実行します。ドキュメントの先頭にあるものは次のとおりです。

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Excel(Mac、2008)が適切にインポートしたくないことを除いて、これはすべて望ましい効果があるようです。Excel には、「UTF-8 として開く」などのオプションがありません。そのため、少しイライラしています。

多くの人が同じ問題を抱えているにもかかわらず、これに対する明確な解決策がどこにも見つからないようです。私が最もよく目にするのは、BOM を含めることですが、その方法を正確に理解することはできません。上記でわかるようにecho、私はこのデータを ing しているだけで、ファイルを書き込んでいません。必要に応じてそれを行うことができますが、現時点ではその必要がないように思われるため、そうしていません. 何か助けはありますか?

echo pack("CCC", 0xef, 0xbb, 0xbf);更新: BOMを検出しようとしていたサイトから取得した BOM をエコーし​​てみました。しかし、Excel は、インポート時にこれら 3 つの文字を最初のセルに追加するだけで、特殊文字を台無しにします。

4

25 に答える 25

314

私は同じ(または同様の)問題を抱えています。

私の場合、出力に BOM を追加すると、次のように機能します。

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

これはかなり醜いハックだと思いますが、少なくとも Excel 2007 Windows ではうまくいきました。Macで動作するかどうかはわかりません。

于 2010-12-14T14:24:34.047 に答える
34

これが私が行った方法です(これは、ブラウザにcsvファイルをダウンロードするように促すためです):

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

Macでスペースバーを押したときのCSVプレビューでのUTF8エンコーディングの問題を修正した唯一のこと..しかし、Excel Mac 2008ではそうではありません...理由はわかりません

于 2011-09-29T17:36:12.467 に答える
23

私はちょうど同じ問題に対処し、2 つの解決策を思いつきました。

  1. bpeterson76で提案されているようにPHPExcelクラスを使用します。

    • このクラスを使用すると、最も広く互換性のあるファイルが生成されます。Excel 2008 Mac、Excel 2007 Windows、および Google Docs で正常に開く UTF-8 でエンコードされたデータからファイルを生成することができました。
    • PHPExcel を使用する際の最大の問題は、速度が遅く、大量のメモリを使用することです。これは、妥当なサイズのファイルでは問題になりませんが、Excel/CSV ファイルに数百または数千の行がある場合、このライブラリは使用できなくなります。
    • これは、いくつかの TSV データを取得して Excel ファイルをブラウザーに出力する PHP メソッドです。これは Excel5 Writer を使用していることに注意してください。つまり、ファイルは古いバージョンの Excel と互換性があるはずですが、どのファイルにもアクセスできなくなりました。だから私はそれらをテストすることはできません。

      function excel_export($tsv_data, $filename) {
          $export_data = preg_split("/\n/", $tsv_data);
          foreach($export_data as &$row) {
              $row = preg_split("/\t/", $row);
          }
      
          include("includes/PHPExcel.php");
          include('includes/PHPExcel/Writer/Excel5.php');
      
          $objPHPExcel = new PHPExcel();          
      
          $objPHPExcel->setActiveSheetIndex(0);
          $sheet = $objPHPExcel->getActiveSheet();
          $row = '1';
          $col = "A";
          foreach($export_data as $row_cells) {
              if(!is_array($row_cells)) { continue; }
                  foreach($row_cells as $cell) {
                      $sheet->setCellValue($col.$row, $cell);
                      $col++;
                  }
              $row += 1;
              $col = "A";
          }
      
          $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
          header('Content-Type: application/vnd.ms-excel');
          header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
          header('Cache-Control: max-age=0');
          $objWriter->save('php://output');   
          exit;   
      }
      
  2. PHPExcel の効率性の問題のため、UTF-8 および Excel と互換性のある CSV または TSV ファイルを生成する方法も理解しなければなりませんでした。

    • 私が思いついた最良のファイルは、Excel 2008 Mac および Excel 2007 PC と互換性があり、Google Docs とは互換性がなく、私のアプリケーションには十分なファイルでした。
    • ここで解決策を見つけました、具体的にはこの回答ですが、問題を説明しているため、受け入れられた回答も読む必要があります。
    • これが私が使用したPHPコードです。tsvデータを使用していることに注意してください(コンマではなくタブを区切り文字として使用しています):

      header ( 'HTTP/1.1 200 OK' );
      header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Content-Type: application/vnd.ms-excel') ;
      header ( 'Content-Disposition: attachment;filename=export.csv' );
      print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
      exit;
      
于 2011-01-21T19:00:20.203 に答える
21

私は同じ問題を抱えていましたが、以下のように解決されました。

    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=utf-8' );
    header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    $df = fopen( 'php://output', 'w' );

    //This line is important:
    fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

    foreach ( $rows as $row ) {
        fputcsv( $df, $row );
    }
    fclose($df);
    exit();
于 2015-12-18T16:31:30.347 に答える
13

Excel は UTF-8 をサポートしていません。UTF-8 テキストを UCS-2LE にエンコードする必要があります。

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');
于 2012-11-08T13:47:00.453 に答える
8

これをフォローアップするには:

問題は単に Mac 上の Excel にあるようです。ExcelからCSVを生成してもファイルが壊れているため、ファイルを生成する方法ではありません。CSVで保存して再インポートしたら文字が全部めちゃくちゃになってしまいました。

だから…これに対する正解はないようです。すべての提案をありがとう。

私が読んだすべてのことから、BOMに関する@Daniel Magliolaの提案は、おそらく他のコンピューターにとって最良の答えになるでしょう。しかし、それでも私の問題は解決しません。

于 2011-01-11T16:56:44.633 に答える
7

CSV ファイルには、バイト オーダー マークを含める必要があります。

または、提案された回避策として、HTTP本文でエコーするだけです

于 2011-10-20T08:56:43.220 に答える
6

追加:

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

または:

fprintf($file, "\xEF\xBB\xBF");

コンテンツを CSV ファイルに書き込む前。

例:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);
于 2016-03-15T06:25:59.247 に答える
4

UTF8エンコーディングはExcelではうまく機能しないため。を使用して、データを別のエンコーディングタイプに変換できますiconv()

例えば

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),
于 2012-11-19T19:30:56.600 に答える
2

CSV 文字列はiconvで変換できます。例えば:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );
于 2012-05-14T13:53:39.927 に答える
1

私はMacを使用しています。私の場合、区切り記号を指定して、"sep=;\n"次のようにUTF-16LEでファイルをエンコードする必要がありました。

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');
于 2016-07-18T22:45:29.380 に答える
1

エンコーディング「Windows-1252」を使用する必要があります。

header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");

たぶん、文字列を変換する必要があります:

private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}
于 2013-04-10T08:41:20.580 に答える
1

私にとって、上記の解決策はどれもうまくいきませんでした。以下は、問題を解決するために行ったことです: PHP コードでこの関数を使用して値を変更します。

$value = utf8_encode($value);

これにより、値が適切に Excel シートに出力されます。

于 2016-12-07T08:55:13.247 に答える
1

エクスポートする前にファイルに 3 バイトを追加することができます。そのシステムを行う前は、Windows と HP -UX でしか動作しませんでしたが、Linux では失敗していました。

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

ファイルの先頭に UTF-8 BOM (3 バイト、16 進数の EF BB BF) があります。そうしないと、Excel は utf-8 ではなく、ロケールのデフォルトのエンコーディング (例: cp1252) に従ってデータを解釈します。

Excel用のCSVファイルの生成、値の中に改行を入れる方法

于 2013-10-23T07:50:16.980 に答える
0

私はこれを使用し、動作します

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;
于 2016-03-27T16:47:50.997 に答える
0

.txt ファイルとして保存し、カンマを区切り文字として Excel で開いた場合でも、問題は発生しますか?

問題はエンコーディングではなく、ファイルが Excel 標準による完全な CSV ではない可能性があります。

于 2010-12-03T18:58:51.750 に答える
0

データをインポートする Excel VBA ルーチンがあったときに、これと同じ問題が発生しました。CSV はプレーン テキスト形式であるため、ワードパッドなどの単純なファイル エディターでプログラムを使用してデータを開き、Unicode テキストとして再保存するか、そこからクリップボードにコピーして Excel に貼り付けることで、この問題を回避していました。Excel が CSV をセルに自動的に解析しない場合は、組み込みの「テキストから列へ」機能を使用して簡単に修正できます。

于 2010-12-03T18:52:22.153 に答える
0

これらのヘッダーを試してみたところ、Windows 7 PC で Excel 2013 を取得して、特殊文字を含む CSV ファイルを正しくインポートできました。バイト オーダー マーク (BOM) は、それを機能させる最後の鍵でした。

    header('Content-Encoding: UTF-8');
    header('Content-type: text/csv; charset=UTF-8');
    header("Content-disposition: attachment; filename=filename.csv");
    header("プラグマ: public");
    header("有効期限: 0");
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

于 2013-07-17T17:45:11.080 に答える