2

PHP のヘッダーを介して正しい文字セット情報を送信する際に問題があります。

私のコードでは、ISO-8859-2 でエンコードされた CSV 文字列を作成しました。次のコード(簡略化)を使用して、これをブラウザに出力しています。

$csv = 'iso-8859-2 encoded string, Łukasz Szukała';

header('Content-Type: text/csv; charset=ISO-8859-2');
header('Content-Disposition: attachment; filename=report.csv');

echo $csv;

結果のファイルは、エディター (私は Notepad++ を使用しています) で開くと ISO-8859-1 として検出されるため、正しく表示されません。

文字列を UTF-8 に変換すると、期待どおりに動作します。

$csv = 'iso-8859-2 encoded string, Łukasz Szukała';
$csv = iconv('ISO-8859-2', 'UTF-8', $csv);

header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=report.csv');

echo $csv;

この場合、文字セット部分を完全に省略することもできます。

ただし、ファイルを ISO-8859-2 でエンコードする必要があり、ヘッダー情報によってファイルが ISO-8859-2 として検出されない理由がわかりません。IANA ( http://www.iana.org/assignments/character-sets/character-sets.xhtml )に従ってさまざまなエイリアスも試しましたが、どのブラウザーでも動作しません。

貴重なご意見をお待ちしております。

4

1 に答える 1

1

Notepad++ がファイルの文字セットを検出することを期待していることを除いて、すべて正しいことをしています。厳密に言えば、ISO-8859-2 はエンコーディングではなく文字セットです。

エディター (任意) によって開かれるファイルは、ブラウザーに送信された、ヘッダーのないプレーン テキストです。そのため、エディターはシングルバイト エンコーディングであることを検出できますが、文字セットを検出できないため、デフォルトのシステム文字セットで開かれます。

エンコード検出に関する私の回答を参照してください

ファイルのエンコーディングは正しいままですが、Notepad++ では正しく表示されません。文字セットがなく、常に正しく表示されるため、UTF-8エンコーディングは別の問題です(私は思う)。

于 2014-03-23T09:38:54.767 に答える