ホーム   »  スポンサー広告  »     »  ネットワーク/Web  »  Android 様は日本語ファイル名でダウンロードできない御様子

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Android 様は日本語ファイル名でダウンロードできない御様子

ファイルをダウンロードさせる Web アプリケーションでの日本語ファイル名対応の雑記です。

一般的な Web アプリケーションでファイルを「表示」ではなく「ダウンロード」させたい場合、レスポンスに Content-Disposition ヘッダを付ける方法を取ります。この時サーバは filename 属性に保存ファイル名を提案することができるわけですが、HTTP 仕様によりヘッダに許可されている文字が us-ascii に限定されています。日本語ファイル名を指定するには RFC 2231 に定義されているように MIME エンコーディングを施す必要があります。

Content-Disposition: attachment; filename=img001.jpg
× Content-Disposition: attachment; filename=はぐれメタル.jpg
Content-Disposition: attachment; filename="=?UTF-8?B?44Gv44GQ44KM56u544Oh44K/44OrLmpwZw==?="

しかし、ほとんどのブラウザは Contnet-Disposition 上の MIME エンコーディングを無視してそのままのバイトシーケンスをファイル名としてしまいます。つまり、HTTP 仕様に違反してクライアント側のローカルエンコーディング (Windows,MacOSX なら Shift_JIS) を使用しないと日本語のファイル名でダウンロードさせることができません。

クライアントが PC のみという時代であれば国際化不備の Work Around としてそれでもよかったのですが、最近は UTF-8 環境のスマートフォンが多くなってきています。厄介なことに Android は filename 属性値を ISO-8859-1 として解釈するため、どのような文字コード (+エンコーディング) を施しても日本語で保存することができません。

機種 OS 挙動
docomo Xperia Android 2.1 保存不能
au INFOBAR A01 Android 2.3.38 文字化け(ISO-8859-1解釈)
Apple iPod touch (第4世代) iOS 5 正常動作(Shift_JIS解釈)

INFOBAR は '*' などのファイル名に使用できない文字を全て '_' に置き換えてくれますが、初代 XPERIA などは「この携帯電話ではサポートされていないコンテンツです」と出て保存すらしてくれません。このため文字化けする日本語ファイル名はほぼ確実に保存を拒否されます。

以下に INFOBAR で試したパターンを載せます。結論として Android 端末はマルチバイト文字も ISO-8859-1 で認識してしまっており MIME 形式も使用できないため、それらを対象にしたサービスでは us-ascii 範囲のファイル名をしようしなければいけないという事です。

エンコーディング filename属性値 保存ファイル名
UTF-8 はぐれメタル.jpg はぐれメタル.jpg
Shift_JIS はぐれメタル.jpg ‚Í‚®‚ꃁƒ^ƒ‹.jpg
MIME(UTF-8) =?UTF-8?B?44Gv44GQ44KM56u544Oh44K/44OrLmpwZw==?= 44OrLmpwZw==_=.bin
MIME(Shift_JIS) =?SHIFT_JIS?B?gs2CroLqknyDgYNeg4suanBn?= =_SHIFT_JIS_B_gs2CroLqknyDgYNeg4suanBn_=.bin
コメント
トラックバック
トラックバック URL
コメントの投稿
管理者にだけ表示を許可する
Profile
Takami Torao
Takami Torao
C/C++ 使いだった 1996年、運命の Java と出会い現在に至る。のらアーキテクト。
Yah, this is image so I don't wanna eat spam, sorry!
Search

Google
MOYO Laboratory
Web

カテゴリー
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
ブロとも申請フォーム
RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。