[解決済み】PHPでUTF-8のCSVを出力して、Excelが正しく読めるようにするにはどうしたらいいですか?
質問
あるものを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文字を一番最初のセルに追加するだけで、まだ特殊文字を台無しにしています。
解決方法は?
引用元 マイクロソフトのサポートエンジニア ,
<ブロッククオートMac版Excelは現在、UTF-8をサポートしていません。
2017年、更新 : これは、以前のMicrosoft Excel for Macのすべてのバージョンに当てはまります。 オフィス2016 . 新しいバージョン(Office 365から)は、UTF-8をサポートするようになりました。
WindowsとOS XのExcelが正常に読み込めるUTF-8のコンテンツを出力するためには、次の2つのことが必要です。
-
UTF-8のCSVテキストをUTF-16LEに変換していることを確認する。
mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
-
を追加していることを確認してください。 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ファイルを扱えるもの、扱えないものについては
余談ですが、もしあなたが
コンポーザー
を追加することを検討してみてください。
League\Csv
をrequireに追加してください。
League\Csv
があります。
CSV ファイルを作成するための非常に優れた API
.
使用方法
League\Csv
この方法でCSVファイルを作成する場合は、以下を参照してください。
この例
関連
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】PHPからPythonスクリプトを実行する
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み] [Solved] Fatal error: メンバ関数 query() の null への呼び出し。
-
[解決済み】chromeの「net : Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR" は何がおかしいのか?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLのクエリ結果をCSV形式で出力するにはどうすればよいですか?
-
[解決済み] PHPでユーザー入力をサニタイズするにはどうすればよいですか?
-
[解決済み] UTF-8のCSVファイルをExcelに強制的に自動認識させることは可能ですか?
-
[解決済み] MacとWindowsのExcelでCSVファイルを正しく開くにはどのようなエンコーディングが必要ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】新しいPHPMailerはPHPMailerAutoload.phpが必要?
-
[解決済み】DateTimeクラスのオブジェクトを文字列に変換できない
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み】file_get_contents( )が動作しない。
-
[解決済み] [Solved] Fatal error: 非オブジェクトのメンバ関数fetch_assoc()の呼び出し [重複]。
-
[解決済み】PDOException SQLSTATE[HY000] [2002] そのようなファイルまたはディレクトリがありません。
-
[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?
-
[解決済み] Microsoft Excelは.csvファイルのダイアクリティクスを混乱させますか?
-
[解決済み] Excel用CSVファイルの生成、値の中に改行を入れるには?
-
[解決済み] MacとWindowsのExcelでCSVファイルを正しく開くにはどのようなエンコーディングが必要ですか?