質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1102閲覧

【PHP】多言語を含むCSVエクスポート時の記述について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/04/23 09:27

<概要>
お世話になります。
ただいま、CSVエクスポート処理の実装を行なっております。
ただ、複数言語(韓国語、英語、フランス語)が混合した形でエクスポートする必要があり、現状は文字化けが生じてしまっております。

<お力添え頂きたいこと>
ソースコードを記載致します。
ネットで調べた中で見つけた、BOM付きでUTF-16LEでエクスポートする
方式を試行しております。
もし可能でしたら、要修正箇所をご指摘頂けますと幸いでございます。

$csv_header = array( 'hogehoge' => 'ホゲホゲ', ); $filename = 'hogehoge.csv'; header("Content-Disposition: attachment; filename*=utf-8'jp'" . urlencode($filename)); header("Content-type: text/csv charset=UTF-16LE"); header('Content-Encoding: UTF-16LE'); $bom = pack('C*',0xEF,0xBB,0xBF); $csv = fopen('php://output', 'w'); foreach ($csv_header as $key => &$str) { $str = $bom . mb_convert_encoding($str, 'UTF-16LE', 'UTF-8'); } fputcsv($csv, $csv_header); foreach ($this->datas as $c) { $csv_row = array(); foreach ($csv_header as $key => $_) { $csv_row[] = $bom . mb_convert_encoding($c[$key], 'UTF-16LE', 'UTF-8'); } fputcsv($csv, $csv_row); } fclose($csv); exit();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/04/23 09:40

どのようなデータが入っていたらどのような表示になりますか?
guest

回答2

0

ベストアンサー

韓国語、英語、フランス語なら utf-8 で良い気がしますが?

投稿2019/04/23 09:35

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

fputcsv$fieldsパラメタで渡された配列の各要素の文字列を単なるバイト列としてみてエスケープ処理を行うので、UTF-16をうまく扱うことができません。UTF-8ならうまくASCIIの範囲は重ならないようになっているからfputcsvでも問題ないので、もし可能ならUTF-8にするのが楽だと思います。

もしどうしてもUTF-16にしなければいけないのなら、fputcsvを使うのは諦めて自前で変換する方法や、fputcsvまではutf-8で処理して、ストリームフィルタで文字コード変換を行う方法が考えられます。

後者だとたぶんこんな感じになるでしょう。

php

1 2 $csv = fopen('php://output', 'w'); 3 stream_filter_append($csv, 'convert.iconv.UTF-8/UTF-16', STREAM_FILTER_WRITE); 4 fputcsv($csv, $csv_header); 5 foreach ($this->datas as $c) { 6 $csv_row = array(); 7 8 foreach ($csv_header as $key => $_) { 9 $csv_row[] = $c[$key]; 10 } 11 fputcsv($csv, $csv_row); 12 } 13 fclose($csv);

参考:
stream_filter_append
PHPでCSVを生成する (ただしメモリ・CPUを抑えて

あとヘッダですが、全体としてはBOMつきのUTF-16なのでcharsetはUTF-16になるはずですし、Content-Encodingは圧縮などのエンコーディング方式を示すのに使うヘッダでcharsetを示すものではありません。

投稿2019/04/23 14:44

crhg

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問