- PR -

ダウンロードで文字化け

投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-22 17:27
引用:

かつのりさんの書き込み (2007-02-22 14:43) より:
http://www.wsdeveloper.com/viewtopic.php?p=149
こちらが参考になるでしょうか。



IEの実装側が問題なのですね…。
今までContent-Dispositionヘッダフィールドに疑問を持ったことは
なかったのですが、ひとつ勉強させてもらいました。
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-02-23 01:10
かつのりさんの挙げられたリンク先で解決してますね。
またrfc2231にMIMEパラメタのエンコードに関する規定がありますのでそちらも確認ください。

-元の書き込み(完全に誤っていた部分は削除)-
MIMEの規定が変わっているか知れませんが、私の知る限りファイル名に使用できるのはUS-ASCIIのみです。
キャラセットの指定も許可されません。
ですので、例えばISO-8859-1へ無理やり変換した日本語ファイル名が表示されるのは、
たまたまマッピングされた位置にISO-8859-1の文字があり、
ブラウザがそのコード列を「マルチバイト文字かな?」と判断したために日本語に変換されているだけです。


[ メッセージ編集済み 編集者: 暁 編集日時 2007-02-23 08:34 ]
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2007-02-23 09:17
Windows2000,XPクライアントという前提で調べたことを書きます。

・ファイル名が JIS X 0208 範囲の場合は、以下の処理で文字化けしない。
IE7:UTF-8をx-www-form-urlでエンコーディング
IE6以前:UTF-8をx-www-form-urlでエンコーディング、Windows-31J の生のバイト列
FireFox:UTF-8のMIMEエンコーディング、Windows-31J/UTF-8 の生のバイト列
Opera8:Windows-31J/UTF-8 の生のバイト列
Netscape4.78:Windows-31J の生のバイト列
Netscape7.1:不明(考え付く方法はすべてダメでした)

・ファイル名が JIS X 0213 範囲の場合は、以下の処理で文字化けしない。
IE:UTF-8をx-www-form-urlでエンコーディング
FireFox:不明(考え付く方法はすべてダメでした)
Opera8:UTF-8 の生のバイト列
Netscape4.78:不明(考え付く方法はすべてダメでした)
Netscape7.1:不明(考え付く方法はすべてダメでした)

結局、ブラウザごとに切り替えるしか方法はないようです。
ちなみに、「生のバイト列」というのは、
コード:
new String(fileName.getBytes("Windows-31J"), "ISO-8859-1");


こういうやつです。
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2007-02-23 09:37
みなさん、レスありがとうございます。
かつのりさんがアップされたURLの方法でうまくいきました。

日本語を使いたいのは、英語より日本語のほうがわかりやすいからです。
という、ごくあたりまえな理由なんですが、すこし話がいりくんでいて
ダウンロードするときに、ユーザは情報の種別を選択するのですが、種別を表す文言に
は当然、日本語が使えますし、使えないというのは受け入れられないでしょう。
その文言がそのままファイル名に使えれば、ユーザはダウンロードした情報・ファイル
の管理が容易になる。
という理由によります。

今のシステムでFireFoxの場合はやむ得ない。とすることはできない話ではないです。
システムの前提はIEでバージョンまで指定しています。
とはいっても実際にリリースすると使われますから、FireFoxでも可能なほうがいいです
し、無理だとしても後日ユーザから指摘されたときのために、技術的な背景を知っておき
たいです。

技術的背景を知って、日本語でいくかどうかは悩んでいるところです。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-02-23 10:35
Content-Dispositionヘッダを使うのではなく、
最初からGETの際のURLを日本語化した場合はどうですか?
これもブラウザごとの挙動が違いそうですが…。

そういえば、昔、IEでContent-Dispositionヘッダの文字数上限があって
ファイル名が長いと途中で切れるという問題が起きたなぁ、と
いまさら思い出しました。
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-02-24 17:16
先の投稿後、少し調べてみました。
リンク先ではBase64のencord-wordsを使用していますが、
URLEncoderを使用すると以下のようになります。
コード:
String fileName = URLEncoder.encode("テスト.txt", "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8'ja'" + fileName);


多少簡単になるとはいえ、こちらもIEでは認識してくれません。IE7ではどうなるのか確認できていませんが。
やはり処理を分けるしかないのか。
今回のことは勉強になりました。自分はUS-ASCIIしか使用できないとかたくなに信じていましたので。
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2007-02-26 14:40
レスありがとうございます。

JIS X 0213やってみました。"T"をFireFoxにファイル名で送ると化けました。
これは制限事項となるでしょう。

IEだとダウンロード時に”開く”を選んでエクセル起動するとエクセルに渡される文字列がばけるんですが
new String(fileName.getBytes("Windows-31J"), "ISO-8859-1");
p.response.setHeader("Content-Disposition","attachment; filename=" + fileName );
とすると化けなくなりました。

ファイル名長いとうまくいきませんね、最大全角20文字を14文字以下に調整するように変更しました。

URLを日本語化というのは、ちょっと意味がわからないのですが
http://hostname/漢字.xls
といった指定でしょうか?
サーバサイドにファイルは存在しないので、この方法はとれません。

いずれにしても、ブラウザ種別を判別してロジックを変えるという方法をとることにしました。


uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2007-02-26 16:29
引用:

progmanさんの書き込み (2007-02-26 14:40) より:
URLを日本語化というのは、ちょっと意味がわからないのですが
http://hostname/漢字.xls
といった指定でしょうか?
サーバサイドにファイルは存在しないので、この方法はとれません。


これは、実際にファイルがある必要はなく、

http://hostname/xxx/FileDownloadServet/漢字.xls

のようにサーブレットが動作するパスの後にダミーのファイル名をつけることにより、
この部分を保存ファイル名として使ってくれる、ということです。実際には漢字コード
そのままではなく、URLエンコーディングする必要があると思いますが。

スキルアップ/キャリアアップ(JOB@IT)