1

私はこれを数時間の調査の後に投稿します(数回...)。まだ答えが見つかりませんでした。

私の目標は、PHPを使用してCSVファイルを作成することです。このファイルには中国語のANSIエンコーディングが必要です(簡体字中国語の場合はGB2312だと思いますが、notepad ++ではANSIのみがエンコーディングとして表示されます)。別のツールにインポートする必要があります。

[重要な注意点]

現在、notepad++と中国語をデフォルト言語とするPCでファイルを変換しています。プロセスは次のとおりです。

  • WebアプリからUTF8CSVを取得します
  • 中国のPCでExcel2003を使用してcsvとして保存
  • notepad ++で開き、エンコーディングはすでにANSIです。先頭の「?」を1つ削除してください。ファイルの先頭。

テストを実行しました。.csvファイルを.phpに変更し、次のコードに置き換えて、同じエンコーディングを維持します。

<?php echo mb_detect_encoding("test"); ?>

これにより、「ASCII」と出力されます。

次に、CSVの出力を確認する必要があります:GB2312?、ASCII?、ANSI?。私はそれらの違いについてさえはっきりしていません。

また、Excel2007で中国語のPCでCSVとして保存されたファイルはこのツールで問題ないことも読みました。

[/重要な注意点]

現在、私はそれを正しくすることができません!notepad ++で取得したファイルを開くと、UTF-8でエンコードされているものとしてエンコードが表示されます。そして、漢字は見栄えが良いので、「壊れている」ように見えるはずです:-)。

次のヘッダー条件を使用しています。

header("Content-type: text/csv; charset=GB2312");
header("Content-Disposition: attachment; filename=$filename.csv");
header("Content-Transfer-Encoding: binary"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
header("Expires: 0");

[追加情報]

私のファイルのコーディング方法は次のとおりです(簡単にするために抽象化しました)

//header, hard coded in Chinese
$csv = "东西,东西,东西\n"; //example "stuff,stuff,stuff"
[...]
//write line by line, status is also hard coded (行)
$csv .= $DB_data_1.",".$DB_data_2.",行\n"; //行=OK

[/追加情報]

また、CSV文字列を印刷する前にiconvを使用してGB2312に変換します(mb_convert_encodingも試しました)

setlocale(LC_ALL,'zh_CN');
$csv = iconv("UTF-8","GB2312",$csv);
echo($csv);

私の.phpファイルはUTF-8エンコーディングで書かれています(BOMなしのUTF-8ではありません)

基本的に、私は常に出力としてUTF-8ファイルを取得します。ANSIが必要です。パラメータ/属性が非常に多いようですが、正しくありません。あなたの助けをいただければ幸いです!

ありがとう!

デビッド

[追加情報]

例として、私のヘッダーの列では、次のエンコード変更があります。

  • PHPソースコード(UTF-8ファイル、英語のコンピューター):序序号(意味:SKU、アイテムコード)
  • 最終的なCSVファイル(ANSIファイル、英語のコンピューター):ÉÌÆ・ÐòºÅ
  • 最終的なCSVファイル(ANSIファイル、中国のコンピューター):序序号

[/追加情報]

4

2 に答える 2

1

文字列 mb_convert_encoding (文字列 $str 、文字列 $to_encoding [、混合 $from_encoding ] )

2 番目のパラメーターはエンコードに対するものであることに注意してください。だからそうあるべきだ

$csv = mb_convert_encoding($csv, "GB2312", "UTF-8");
于 2012-07-27T10:40:06.680 に答える
1

送信する HTTP ヘッダーは、返信する文字セットをクライアントに指定するだけです。コンテンツは変換されません。したがって、 を指定charset=GB2312して utf8 を送信すると、単に嘘をついています。いずれにせよ、コンテンツはとにかくバイナリとして転送されるため、charset 属性はここでは意味がありません。

あなたがする必要があるのは、送信する前にコンテンツを変換することです。これには Iconv または mbstring が適切なツールです。まず、データが入ってくる文字セットを確認することから始めます。おそらく、データはどこか (データベースなど) から読み込まれます。あなたが少し迷っていることを考えると、それがあなたが思っているものではない可能性が十分にあります. たとえば、utf-8 ではなく iso-8859-1 である可能性があります。

本当に utf-8 であることを確認したら、既に試したように iconv を使用します。

$csv = iconv('UTF-8', 'GB2312', $csv);

$csvそれがcsvファイルを含む文字列であると仮定します。

于 2012-07-27T10:40:24.850 に答える