17

次のコードがあります。

public void ProcessRequest (HttpContext context) 
{
    context.Response.ContentType = "text/rtf; charset=UTF-8";
    context.Response.Charset = "UTF-8";
    context.Response.ContentEncoding = System.Text.Encoding.UTF8;
    context.Response.AddHeader("Content-disposition", "attachment;filename=lista_obecnosci.csv");
    context.Response.Write("ąęćżźńółĄŚŻŹĆŃŁÓĘ");
}

生成された csv ファイルを開こうとすると、次のような動作が発生します。

  • Notepad2 では、すべて問題ありません。
  • Word の場合 - 変換ウィザードが開き、テキストを変換するよう求められます。それはどういうわけか大丈夫なUTF-8を提案します。
  • Excel では、本当に混乱します。これらのポーランド語の文字は表示できません。

文字列の前にこれらの特別なエンコーディング情報文字を書きたかったのです。

context.Response.Write((char)0xef);
context.Response.Write((char)0xbb);
context.Response.Write((char)0xbf);

しかし、それは何の役にも立ちません。応答ストリームはそれを通常のデータとして扱い、別のものに変換します。

これについて助けていただければ幸いです。

4

4 に答える 4

25

私は同じ問題に遭遇しましたが、これが私の解決策でした:

context.Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
context.Response.Write("ąęćżźńółĄŚŻŹĆŃŁÓĘ");
于 2012-09-18T20:00:40.727 に答える
24

「エンコード情報」と呼ばれるものは、実際には BOM です。これらの「文字」のそれぞれが別々にエンコードされていると思われます。BOM を手動で書き込むには、3 文字ではなく 3バイトとして書き込む必要があります。私は .NET I/O クラスに詳しくありませんが、byte または byte[] パラメータを取り、それらをファイルに直接書き込むメソッドが利用できるはずです。

ちなみに、UTF-8 BOM はオプションです。実際、その使用は Unicode コンソーシアムによって推奨されていません。それを使用する特定の理由がない場合は、手間を省いてそのままにしておいてください。

編集:実際の BOM文字,を記述し'\uFEFF'て、エンコーダーに処理させることもできることを思い出しました:

context.Response.Write('\uFEFF');
于 2009-06-17T23:26:07.520 に答える
2

問題は、.csvファイルのMicrosoftExcelマングル発音区別符号に基づくExcelにあると思います。これを証明するには、のサンプル出力文字列をコピーąęćżźńółĄŚŻŹĆŃŁÓĘして、お気に入りのエディターを使用してテストファイルに貼り付け、UTF-8でエンコードされた.csvファイルとして保存します。Excelで開き、同じ問題を確認します。

于 2009-06-18T01:51:20.737 に答える
1

VB に翻訳されたAlan Mooreからの回答:

Context.Response.Write(""c)
于 2012-04-17T13:22:24.580 に答える