none
日本語ファイルのダウンロードについて RRS feed

  • 質問

  • VisualStudio2005ProffesionalでWebサイトを作成しています

    http://support.microsoft.com/default.aspx?scid=kb;ja;436616

    に記述されている

    ASP.NET 2.0 では、構成ファイル globalization 要素に responseHeaderEncoding 属性が用意され、これにより HTTP ヘッダのエンコード方式を指定できるようになりました。これによって ASP.NET で Shift-JIS を使用して HTTP ヘッダを送信することができます。

    は正しいのでしょうか?

    たとえばジェネリックハンドラを作成し以下のように記述し

        Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
            context.Response.ContentType = "text/plain"
            context.Response.AppendHeader("Content-Disposition", "attachment; filename=" _
              & HttpUtility.UrlEncode("あいうえおかきくけこさしすせそなにぬねの") & ".txt")
            context.Response.Write("Hello World")
        End Sub

    web.configに以下を追加しました

        <globalization responseHeaderEncoding="shift_jis"/>

    この場合ダウンロードされるファイル名は『3おかきくけこさしすせそなにぬねの.txt』になります。

    なにか間違えているのでしょうか?

    2006年9月11日 5:18

回答

  • > この場合ダウンロードされるファイル名は『3おかきくけこさしすせそなにぬねの.txt』になります
     
    と書かれていたので、URL Encoding を行うのが正しいのだと思ってしまいました。
    きちんと調べると、URL Encoding は行う必要がないので、

    context.Response.AppendHeader("Content-Disposition", "attachment; filename=あいうえおかきくけこさしすせそなにぬねの.txt")

     
    がただしい記述になります。これで IIS+IE6, IIS+FireFox ともに問題なくデフォルトのファイル名がつきました。
     
    ただ、別の問題があって、ヘッダーエンコーディングを実際に実施しているのは、HttpWorkerRequest 抽象クラスの派生クラスたちです。これには IIS 用や、シンプルサーバ用などが個別に用意されているんですが、どうもシンプルサーバ用のヘッダーエンコーディングの実装に不備があるか、仕様の行き違いがあるようです。
    このため、Visual Studio 2005 のデバッグサーバや、System.Web のシンプルサーバを利用した場合には、上記のコードで正しくファイル名を送ることができませんでした。このあたりは時間と気力があったらもう1回調査しなおしてみたいところです。
    2006年9月11日 12:54
  • あとから参照する人のために、 補足しておきます。

    ・ HTTP ヘッダには、 そもそも Content-Disposition を含めるべきではない。
      → RFC2616 (HTTP/1.1) の section 15.5

    ・ Content-Disposition を使うとき、 そのパラメータに non-ASCII キャラクタを含めるならば、 RFC 2231 に従ってエンコーディングすべきである。
      → RFC2231 MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations
      → (参考) 「添付ファイルにおける日本語のファイル名に関して

    ・しかしながら、 IE は RFC2231 に従った実装をしていない。
      → KB436616: ファイルをダウンロードする ASP.NET Web ページで日本語ファイル名が文字化けする

    /*
    Content-Disposition ヘッダのパラメータの文字コードのエンコード方式に関しては、RFC2231 に基づくべきですが、現行の Internet Explorer はこのエンコード方式をサポートしていません。
    */

    ・IE に対して、 non-ASCII キャラクタを含むファイル名を Content-Disposition で渡すためには、 KB436616 に書かれているように…

    /*
    クライアントコンピュータのロケールを日本語にしている場合、Internet Explorer ではこのパラメータで渡された文字列 (ファイル名) を Shift-JIS でエンコードされているものとして処理します。
    */

    …ベタなシフト JIS の文字列とするか、 あるいは、 UTF-8 なファイル名を単に URI エンコードします。

    ・上記の対処は、 IE の実装に合わせただけですから、 当然ながら、 他のブラウザでも上手くいくという保証はありません。 また、 シフト JIS を使った場合、 ロケールが日本語ではない Windows の IE では、 文字化けするでしょう。

    2006年9月12日 2:12

すべての返信

  • > HttpUtility.UrlEncode("あいうえおかきくけこさしすせそなにぬねの") & ".txt")
     
    ここが間違っていますね。 UrlEncode メソッドは与えられた文字列を HeaderEncoding に変換する機能をもっていません。
    ( UrlEncode がどこで利用されるか決まっていないので)
     
    ですので、事前に HeaderEncoding と同じ形式に変換する UrlEncode("あいうえお", encoding) をつかうと楽そうです。
     
    2006年9月11日 6:41
  • やっぱりそういうことなんですかね。ただ一応はそう思って以下のコードは試してみています。

            context.Response.AppendHeader("Content-Disposition", "attachment; filename=" _
                                           & HttpUtility.UrlEncode("あいうえおかきくけこさしすせそなにぬねの", context.Response.HeaderEncoding) & ".txt")

    これ以外にもいくつか試してみましたがどれも最初のコード以下の文字化けにしかなりませんでした。

    まだ別の記述が必要なんでしょうか

    2006年9月11日 7:06
  • > この場合ダウンロードされるファイル名は『3おかきくけこさしすせそなにぬねの.txt』になります
     
    と書かれていたので、URL Encoding を行うのが正しいのだと思ってしまいました。
    きちんと調べると、URL Encoding は行う必要がないので、

    context.Response.AppendHeader("Content-Disposition", "attachment; filename=あいうえおかきくけこさしすせそなにぬねの.txt")

     
    がただしい記述になります。これで IIS+IE6, IIS+FireFox ともに問題なくデフォルトのファイル名がつきました。
     
    ただ、別の問題があって、ヘッダーエンコーディングを実際に実施しているのは、HttpWorkerRequest 抽象クラスの派生クラスたちです。これには IIS 用や、シンプルサーバ用などが個別に用意されているんですが、どうもシンプルサーバ用のヘッダーエンコーディングの実装に不備があるか、仕様の行き違いがあるようです。
    このため、Visual Studio 2005 のデバッグサーバや、System.Web のシンプルサーバを利用した場合には、上記のコードで正しくファイル名を送ることができませんでした。このあたりは時間と気力があったらもう1回調査しなおしてみたいところです。
    2006年9月11日 12:54
  •  
    context.Response.AppendHeader("Content-Disposition", "attachment; filename=あいうえおかきくけこさしすせそなにぬねの.txt")
    上記のコードでIISでは動作することを確認しました。
    どうもありがとうございました。テストはデバッグサーバでしか試してなかったので結果的にそのコードをIISでは試していませんでした。まさかそんな差があったとは。
    http://support.microsoft.com/default.aspx?scid=kb;ja;436616のページはASP2.0のときの記述法が不明確でデバッグサーバでは動作しないことが書かれていないので今回のことをフィードバックの方にあげておきます。
     
    今回のようにデバッグ、シンプルサーバとIISの動作の差がのっているようなページはあるのでしょうか。
     

    2006年9月12日 1:33
  • あとから参照する人のために、 補足しておきます。

    ・ HTTP ヘッダには、 そもそも Content-Disposition を含めるべきではない。
      → RFC2616 (HTTP/1.1) の section 15.5

    ・ Content-Disposition を使うとき、 そのパラメータに non-ASCII キャラクタを含めるならば、 RFC 2231 に従ってエンコーディングすべきである。
      → RFC2231 MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations
      → (参考) 「添付ファイルにおける日本語のファイル名に関して

    ・しかしながら、 IE は RFC2231 に従った実装をしていない。
      → KB436616: ファイルをダウンロードする ASP.NET Web ページで日本語ファイル名が文字化けする

    /*
    Content-Disposition ヘッダのパラメータの文字コードのエンコード方式に関しては、RFC2231 に基づくべきですが、現行の Internet Explorer はこのエンコード方式をサポートしていません。
    */

    ・IE に対して、 non-ASCII キャラクタを含むファイル名を Content-Disposition で渡すためには、 KB436616 に書かれているように…

    /*
    クライアントコンピュータのロケールを日本語にしている場合、Internet Explorer ではこのパラメータで渡された文字列 (ファイル名) を Shift-JIS でエンコードされているものとして処理します。
    */

    …ベタなシフト JIS の文字列とするか、 あるいは、 UTF-8 なファイル名を単に URI エンコードします。

    ・上記の対処は、 IE の実装に合わせただけですから、 当然ながら、 他のブラウザでも上手くいくという保証はありません。 また、 シフト JIS を使った場合、 ロケールが日本語ではない Windows の IE では、 文字化けするでしょう。

    2006年9月12日 2:12
  •  biac さんからの引用

    ・上記の対処は、 IE の実装に合わせただけですから、 当然ながら、 他のブラウザでも上手くいくという保証はありません。 また、 シフト JIS を使った場合、 ロケールが日本語ではない Windows の IE では、 文字化けするでしょう。

    補足ありがとうございます。前提条件として KB を理解されているってことで、無用な補足はいらないかな、と思い記述しませんでした。
    仕組み自体は ASP.NET 2.0 でやってるのでブラウザファイルあたりで切り替えたいところですね。
     
     biac さんからの引用
     
    また、 シフト JIS を使った場合、 ロケールが日本語ではない Windows の IE では、 文字化けするでしょう。
    まあ、ロケールが日本語ではない場合、どのようなエンコーディングでも概ね読めないので、日本語ファイル名が使われるような環境でブラウザが IE なら ShiftJIS で投げても運用上はなんとかなりそうかな、とは思います。
    アップローダー系ならファイル名はサービス側で割り振るのがよくある仕組みですし、自由なファイル名を利用者につけさせるのは多少危険ですね。
    ダウンロードサービスならユーザを認識しているから日本語ファイル名が ShiftJIS で送られることにおおきな問題がでにくいかな、と楽観します。
     
    2006年9月12日 5:40
  •  Lady.BUG さんからの引用
    ダウンロードサービスならユーザを認識しているから日本語ファイル名が ShiftJIS で送られることにおおきな問題がでにくいかな、と楽観します。

    IE7 で、 問題が出ているようですね。 ITpro 11月29日付けの記事より、 引用。

    サイト上に保存したファイルの一覧を表示する段階では正常だが, 右クリックで表れるメニューで 「対象をファイルに保存」 を実行して表れるダイアログで文字化けする。
    (…中略…)
    すべてのオンライン・ストレージ系サービスが影響を受けるわけではないようだ。
    (…中略…)
    文字化けするルールは, 文字コードが 「XX5C」 「XX7C」 のように 「5C」 「7C」 を含む2バイト文字があると, 「XX5F」に変換されるというもの。 予算の 「予」 の文字コードはシフト JIS で 「975C」 だが, 「975F」 に変換され 「誉」 になる。
    2006年12月1日 1:50