Excelで正しく読み取れるようにPHPでUTF-8 CSVを出力するにはどうすればよいですか?


191

私はこれを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、私はこのデータ、ファイルを作成していません。必要に応じてそれを行うことができます。現時点では必要がないように思えるからです。何か助けは?

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


2
Excelには、受信ファイルの文字セットを調整するオプションがありませんか?あなたはそれについて100%確信していますか?私は試してみることができないので、私は便利なコピーを持っていないが、私はそこに想像しなければならないのボックスのどこかにドロップダウンすること。
Pekka

これはMacのExcelです-PCのExcelより制限があるようです。開くダイアログにはドロップダウンはありません。それ以外に開くことができるファイルの種類はありません。私は至る所を見てきました。そこにある場合は、あいまいです。私は98%確かだと思います。
Ben Saufley、

Microsoft Officeまたはopenoffice?
ajreal

Microsoftはこの点でより優れています。OpenOfficeにBOMさえも文字セットを検出させない(私が見つけた)方法はありません。それをくそー。
Ciantic 2012

BOMはMicrosoft Excel 2008 for Macにも影響しません。
Ben Saufley、2012

回答:


134

マイクロソフトのサポートエンジニアを引用するには

Excel for Macは現在UTF-8をサポートしていません

2017年の更新:これは以前のMac版Microsoft Excelのすべてのバージョンに当てはまります。 Office 2016。新しいバージョン(Office 365から)はUTF-8をサポートするようになりました。

WindowsとOS Xの両方でExcelが正常に読み取れるUTF-8コンテンツを出力するには、次の2つのことを行う必要があります。

  1. UTF-8 CSVテキストをUTF-16LEに必ず変換してください

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. ファイルの先頭に必ずUTF-16LEバイトオーダーマークを追加してください。

    chr(255) . chr(254)

OS X上のExcelでのみ発生する次の問題(ただし Windowsでは)、カンマ区切りの値を含むCSVファイルを表示する場合です。Excelは、1行のみの行と、最初の行のコンマとともにすべてのテキストをレンダリングします。

これを回避する方法は、分離した値としてタブを使用することです。

PHPのコメントからこの関数を使用しました(コンマの代わりにタブ「\ t」を使用)、OS XおよびWindows Excelで完全に機能しました。

行の終わりとして空の列の問題を修正するには、次のようにコード行を変更する必要があることに注意してください。

    $field_cnt = count($fields);

    $field_cnt = count($fields)-1;

このページの他のコメントの一部が言うように、OpenOffice Calc、Apple独自のNumbers、Google DocのSpreadsheetなどの他のスプレッドシートアプリは、コンマを含むUTF-8ファイルに問題がありません。

ExcelのUnicode CSVファイルで機能する機能と機能しない機能については、この質問の表を参照してください


補足として、Composerを使用している場合は、必要に応じて追加League\Csvする方法を確認する必要があります。CSVファイルを作成するための本当に素晴らしいAPIをLeague\Csv持っています

League\CsvこのCSVファイル作成方法で使用するには、この例を確認してください


1
バカと呼んでも、私はこの仕事をすることができません。mb_convert_encoding関数を使用してデータを変換し、ファイルの内容の前にBOMを出力しましたが、Excelでファイルを開くと、中国語の文字が1行だけ表示されます。私は今のところまだタブではなくコンマを使用していますが、おそらくそれが私が見ているものの原因ではないはずです。
John Rix 2014

@JohnRixは奇妙です。このコードは、CSVファイルのエクスポートで発生したすべての問題を文字通り解決しました。ただし、コンマのみを受け入れるインポーターを除きます。使用しているコードのペーストビンと、CSVに変換する配列とエクスポートされたファイルのコピーを一緒に送っていただけませんか?
Tim Groeneveld 2014

2
このソリューションでは、MacとWindowsでのUTF8の問題も解決しました。また、CSVファイルに、sep=;またはsep=,CSVファイルに行を追加すると、CSVがどのように区切られ、列が再び正しく作成されるかがExcelに通知されることもわかりました。
Luc Wollants 2014年

5
文字列をBOMだけで開始し、別の行にを追加し"sep=,\n"、次に別の行にデータを追加すると、文字化けが発生することがわかりました。すべて1行で行った場合は問題ありませんでした($csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');)。すべてがMacで見栄えがしました。テストするWindowsがありません。
2014

2
完全に私のために働いた唯一のもの。マイクロソフトの矛盾は、私を驚かせ続けることを決して止めません。通常のcsvファイルを保存すると、区切り文字として「、」が使用されますが、BOMがある場合は、何らかの理由で「\ t」を使用して保存します。.csvのCは、 "COMMA" dammitの略です。それは本当に難しいことではありません。
Phil

288

同じ(または同様の)問題があります。

私の場合、出力に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で動作するかどうかわからない。


10
醜いですが、とても役に立ちました。ありがとうございました。
abelito

7
残念ながら、これはOS Xではまったくうまく機能しません。私はあなたがインポートするとき、それは実際にBOMを表示するかもしれないと思う:(警告かすんでの思い出を。)
davidtbernal

2
これは正しいです。少なくとも、上の例のようにBOMを前に付けてみましたが、確かに最初にいくつかのファンキーな文字が表示され、特殊文字が誤って表示され続けていました(Excel 2011でテスト済み)。これは、すべての設定で私にとって最適に機能するようでした:stackoverflow.com/a/1648671/1005334(PHPを使用)。
カシミール2012年

4
どうやら他の多くの人がそれに出くわしたので、私はこの質問について警告を受け続けています。これは多くの賛成を得ているので、私はこれを正しいものとしてマークできるといいのですが。残念ながら、私はようやくこのソリューションを試してみました(そのプロジェクトはずっと前に放棄されました)が、Excel 2008 for Macでは機能しません。よかったです。私は解決策を支持しました。しかし、それはExcel for Mac 2008の問題を解決しません。Macで誰かが運が良ければ、間違いなく私(そしてどうやら全員)に知らせてください。
Ben Saufley、2012年

MS Excel Starter 2010にCSVファイルを美しく出力して動作します。ありがとうございました。
ジェイミーデクスター

32

ここに私がそれをした方法があります(それはブラウザに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ではできません...理由がわかりません


1
コードのUTF-8 BOM行は、xlsへのエクスポートで私の日を節約します
Mladen Janjetovic

6
この投稿に出くわしたときに、utf8としてブラウザーに直接出力する方法を探していました。BOMとバイナリ転送ヘッダーに関するこの投稿へのクレジットを含む私のソリューションは次のとおりです。$outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
fyrye 2014年

タイプミス-ダブルを削除し))ます。
2015年

22

私は同じ問題に対処し、2つの解決策を考え出しました。

  1. bpeterson76の提案に従ってPHPExcelクラス使用します

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

私はWindows-7 Excel 2007で同じ問題に直面していて、すべての提案を試みましたが失敗しました:(
PHPフェラーリ

UTF-16LEソリューションが機能しました。tsvを正しくフォーマットする必要があり、それはtscでなければならないため、タブ区切りであり、コンマ区切りではないことに注意してください。こちらのマークの投稿もご覧ください:stackoverflow.com/a/1648671/1697370
Ellert van Koperen 14

16

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

    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();

13

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

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

3
上記のように、存在するすべての文字をカバーするUTF-16LEを使用することをお勧めします。
Ellert van Koperen 14

このmb_convert_encodingが正常に機能し、エクスポートされたXLSファイルで発音区別符号が正しく表示されていることに気付きました。私はmysqlのデフォルト設定とutf-8で動作するように設定されたapache + phpを持っています
JuniorMayhéOct

10

私の場合、以下は、Excelで正しく表示されるUTF-8文字を含むCSVファイルを作成するのに非常にうまく機能します。

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

0xEF 0xBB 0xBFBOMヘッダは、Excelが正しいエンコーディングをお知らせします。


1
ビッグフォーユーブラザー<3
エイドリアンG

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<-これがまさに私が必要としたものです。それは魅力のように働きます。
Alex

8

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

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

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

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


UTF8のサポートはMacとWindowsで一貫していないため、最善の策は完全に異なるエンコーディングを使用することです。私はcp1252がMicrosoftのもので一般的にうまく機能することを見つけました。en.wikipedia.org/wiki/Windows-1252
s29

1
ベン、この質問への正しい答えがあります:)私を参照してください!
Tim Groeneveld、2014

7

これは、WindowsとMac OSの両方でExcelで正常に動作します。

分音記号、キリル文字、ギリシャ文字、通貨記号を含む文字を表示しないExcelの問題を修正します。

function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}

このソリューションにより、Googleスプレッドシートでもエクスポートを機能させることができました(他の一部は失敗しました)
Cafn

6

CSVファイルには、バイトオーダーマークが含まれています。

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


4

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

例えば

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),

これは、Excel Mac 2011で私のために機能した唯一のソリューションでした
Christer Fernstrom

4

追加:

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);

3

すでにutf-8でエンコードされたテキストを使用して変換するmb_convert_encoding必要はありません。元のコンテンツの前に3つの文字を追加するだけです。

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

私にとって、これはcsvファイル内の特殊文字の問題を解決しました。


信じられない; 他に少なくとも10個のソリューションを試しましたが、UTF-8 BOMをを介して組み合わせると、これが唯一のソリューションのようfputsです。
kaarto 2018

2

調査したところ、MACおよびWindowsでUTF-8がうまく機能していないことがわかったので、Windows-1252で試しましたが、どちらでもサポートされていますが、ubuntuではエンコードのタイプを選択する必要があります。これが私のコードです$valueToWrite = mb_convert_encoding($value, 'Windows-1252');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

2
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($filename, $headings, $data) {

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
    exit;
}

2
一般に、コードに意図されていること、および他の人を紹介することなく問題を解決する理由の説明が含まれている場合、回答ははるかに役立ちます。
Tim Diekmann、2018年

1

Excel自体に出力するだけではどうですか? これは、サーバー側でXLSファイルを生成できる優れたクラスです。私はcsvを「把握」できず、これまでに不満を感じたことがないクライアントに頻繁に使用します。また、csvでは実行できない追加の書式設定(シェーディング、行の高さ、計算など)も可能です。


phpexcelには大量のデータに関する問題があることに注意してください。
Ellert van Koperen 14

1

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

$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) );

すばらしいサンプルテキスト;)
ngeek

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);
}

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ファイルの生成、値内に改行を入れる方法


1

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

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');

1

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

$value = utf8_encode($value);

この出力値は、Excelシートで適切に出力されます。


0

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


私はそれを試しました!ただし、すでにUnicodeテキストとしてエンコードされています。Unicodeテキストとして保存しても、何も変更されません。すべての特殊文字を正しく解釈せずに、プレーンテキストとして保存するにはどうすればよいですか?
Ben Saufley、

「Unicodeテキストとして保存する」ということは、アランが「UTF-16LE」を意味するのではないかと思います。Windowsは(悲しいことに) "Unicode"を使用して、先頭にBOMがあるUTF-16LEまたはUTF-16LEを誤って参照します。メモ帳のファイル->保存ダイアログでは、この方法で「Unicode」を使用しています。
タナトス

0

.txtファイルとして保存し、コンマを区切り文字としてExcelで開くと、問題は引き続き発生しますか?

問題はエンコーディングではないかもしれませんが、ファイルがExcel標準に従って完全なCSVではない可能性があります。


私の知る限り、CSV形式で問題ありません。TextEditで「完全な」CSVを作成できます。問題はありません。また、txtの名前をcsvに変更することもできるので、秘密を逃していません-CSVは単なるテキストファイルです。さらに、Excelの書式設定はすべて完璧で、壊れるのは特殊文字だけです。しかし念のため、私はあなたの提案を試みました、そしてそれは悲しいことに同じ問題を生み出しています。
Ben Saufley、2010

「WTF彼らは考えていた」部から:Microsoftによると、正しいフィールド区切り文字はロケール依存であることに注意してください。「カンマ区切り」ファイルでは、一部のロケールでは実際にフィールドをセミコロンで区切る必要があります
。OpenOffice

それはかなりおかしいです-残念ながら、フィールドを適切に区切ることに問題はありません。これらの特殊文字で問題が発生しています。
Ben Saufley、2010

0

この投稿はかなり古くなっていますが、何時間も試した後、自分のソリューションを共有したいと思います。おそらく、ExcelやMac、CSVを扱う人を助けて、この脅威に遭遇します。Excelユーザーを念頭に置いて、データベースからの出力としてcsvを動的に生成しています。(UTF-8とBOM)

私はたくさんのiconvを試しましたが、Mac Excel 2004でドイツのウムラウトを動作させることができませんでした。1つの解決策:PHPExcel。それは素晴らしいですが、私のプロジェクトでは少し多すぎます。私にとってうまくいくのは、csvファイルを作成し、このcsvファイルを次のPHPsnippet:csv2xlsで xlsに変換することです。結果のxlsは、ドイツのウムラウト(ä、ö、Ü、...)で動作します。


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( "プラグマ:パブリック");
    header( "有効期限:0");
    echo "\ xEF \ xBB \ xBF"; // UTF-8 BOM


はい、それはそれはWindows用のExcelで正常に動作しますが、正しいですが、私の答えで説明し、それはOS X用のエクセル上では動作しませんように
ティムGroeneveld

0

それ以外の場合は、次のことができます。

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);

0

Mac Excel 2008の簡単な解決策:私はこれに何度も苦労しましたが、簡単な修正がここにあります。UTF-8文字を正しく開くはずのTextwranglerで.csvファイルを開きます。下部のステータスバーで、ファイル形式を「Unicode(UTF-8)」から「Western(ISO Latin 1)」に変更し、ファイルを保存します。Mac Excel 2008に移動し、[ファイル]> [インポート]> [csvを選択]> [ファイルを検索]を選択し、[ファイルの起点]で[Windows(ANSI)]を選択すると、UTF-8文字が正しく表示されます。少なくともそれは私にとっては...


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;

0

#Excelで正しく読み取れるPHPのUTF-8 CSVを出力します。

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';

1人につき1つの回答で十分です。今後はいつでも回答に情報を追加できることを覚えておいてください
。2

-1
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));

この質問は変換方法を尋ねるのではなく、出力方法を尋ねます。この貢献の関連部分は、UTF-16で出力され、すでにSelected Answerで提供されています。
Ben Saufley、2015年

@BenSaufleyまあ、それは2行の簡単なコードで問題の問題を解決します
b3wii

質問はすでに解決されており、より完全に説明されています。
Ben Saufley、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.