新しい記事を書く事で広告が消せます。
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 |