質問

現在、ASP .NETアプリケーションにVisual Studio 2008を使用しています。 Responseオブジェクトを介してExcelファイルをサーバーにしようとしています。問題は、ファイルのタイトルを日本語に設定できないように見えることです。日本語のファイル名に設定すると、文字化けとして返されます。日本語版WinXPで日本語版IEブラウザを使用しています。

Response.AppendHeader("Content-Type", "application/vnd.ms-excel");
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", "日本語.xls"));

または

Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", Server.HtmlEncode("日本語.xls")));

すでにエンコーディングをShift-JISに変更しようとしました

Response.Charset = "Shift_JIS";

または

Response.Charset = "sjis";

アイデアはありますか?ところで、私はVisual Studio 2005でも同じ問題を抱えていました。

役に立ちましたか?

解決

私はASPの専門家ではありませんが、UrlEncodeを使用してファイル名を再コーディングしようとしましたか?

Response.AddHeader("Content-Disposition",
    System.Web.HttpUtility.UrlEncode(String.Format("attachment; filename=\"{0}\"", "日本語.xls")));

他のヒント

Response.Charset は、HTTP要求の本文のみに関係します。 HTTP仕様によれば、ヘッダーは暗黙的にISO-8859-1としてエンコード-そのエンコード以外の文字は MIMEエンコードである必要があります。

これは論理的なものです-結局、 Response.Charset によって設定された本文のエンコード自体はヘッダーで指定されます。

ようやく機能しました...:)

System.Web.HttpUtility.UrlPathEncode を使用するとガベージの問題は解決しますが、ファイルを開くと、実際の日本語の文字ではなく、ユニコードでエンコードされていない名前がファイル名に表示されます。 IE7およびIE6の問題、UrlPathEncodeはIE8で正常に動作します。

したがって、 System.Web.HttpUtility.UrlPathEncode を使用する代わりに、Responseヘッダーに使用されるエンコードを使用してfilnameをデコードする必要があります。

.NETでは、デフォルトで、Responseヘッダーのエンコードはutf-8であるため、iso-8859-1に変更します。 以下に示すように、同じようにweb.configを変更します。

<globalization responseHeaderEncoding="iso-8859-1" .../>

そしてコードは次のようになります

    //apply Response header's encoding i.e. iso-8859-1 to the filename.
    Dim fileName as String = "在庫あり全商品を24時間以内に出荷.doc" 
    Dim enc As Encoding = Encoding.GetEncoding("shift_jis") 
    Dim dec As Encoding = Encoding.GetEncoding("iso-8859-1")
    fileName = dec.GetString(enc.GetBytes(fileName))

    //Show Download Dialog box and Writting it on Client Side.
    Response.ClearHeaders() 
    Response.ContentType = corspBean.ContentType 
    Response.AppendHeader("content-disposition", "attachment; filename=""" + fileName + """") 
    Response.BinaryWrite(bytes) 
    Response.End()

もう1つ重要なことは、そのために多くの時間を無駄にしたことです。これはASP.NET開発サーバーでは機能しません、つまり、Webのテスト/デバッグに使用するサーバーですローカルマシン上のアプリ。したがって、ソリューションをIISに展開し、そこからテストします。 IISで完全に機能します。 (およびIISはすべてのASP.NETアプリの運命です。)ASP.NET開発サーバーで動作するかどうかは関係ありません)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top