MIME とは何か?
インターネットでは、データは、1バイト8ビットで送られます。受け手側のソフトは、このバイト群を受け取り、正しい順番に並べます。ここで、「これらは何を表しているのだろう?」という疑問が生じます。それは文章でしょうか?
画像でしょうか? あるいは音楽でしょうか? これが何を意味しているかを知るには、どうしたらよいのでしょう?
仮に、内容を表すバイト群に加えて、データが何を表しているのかを示す数バイトが一緒に送られてきたらどうでしょう。これがあれば、受け手側のソフトや受け手その人は、メッセージを構成するバイト群が何であるかを知る事ができます。MIME
の役割はまさにこれです。MIME は、メッセージに何が含まれているかを知らせるものであり、これによりメッセージの内容は適切な方法で表示されるのです。
MIME はどんな風に見られるのか?
最も簡単なのは、メールとニュースから始めることでしょう。メールのメッセージを見ると、その冒頭にたくさんの記述があります。一例を挙げましょう。
From - Tue Apr 1 09:39:21 1997 Received: from cantor (ppp-phx-15.futureone.com [207.2.43.15]) by future.futureone.com (8.8.2/8.8.0) with ESMTP id JAA23032 for Tue, 1 Apr 1997 09:36:14 -0700 (MST) Received: from cantor (localhost [127.0.0.1]) by cantor (8.7.4/8.7.3) with SMTP id JAA00568 for ; Tue, 1 Apr 1997 09:38:57 -0700 Sender: chucksimmons@futureone.com Message-ID: <33413A21.412D43B3@futureone.com> Date: Tue, 01 Apr 1997 09:38:57 -0700 X-UIDL: 859912584.000 From: Chuck Simmons Organization: Organized? You jest! X-Mailer: Mozilla 3.01 (X11; U; Linux 2.0.0 i486) MIME-Version: 1.0 To: Chuck Simmons Subject: Test of from Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Status: U X-Mozilla-Status: 0001 Content-Length: 367いろいろ記述されていますが、MIME に関係しているのは二つだけです。その二つとは、Content-Transfer-Encoding: と Content-Type: です。ここで、Content-Type: に注目しましょう。このアイテムは、どのようなデータが送られてきたかを示すものです。このメッセージでは、データは「text/plain」です。もうおわかりでしょう。「text/plain」が、このメッセージのMIME タイプです。「text」の部分はMIME タイプと呼ばれ、「plain」の部分はMIME サブタイプと呼ばれます。タイプとサブタイプの間は、常に「/」で分けられます。一つのタイプは多数のものを含みます。text にはいろんな種類があります。サブタイプは限定的です。plain text は、一種類しかありません。(character set も限定的ですが、現在の議論には重要ではありません)
一般的な MIME タイプは?
text/plain 通常のメールやニュース text/html ウェッブ上などのHTML 文書 image/jpeg 一般的な画像フォーマット image/gif これも一般的な画像フォーマット application/octet-stream 未知のタイプ、ある種のデータ群 audio/midi midi フォーマット audio/x-midi midi フォーマットの別の表現 application/ps PostScript 文書を示すこのリストは、多数あるMIME タイプの中から、ごくわずかを挙げたに過ぎません。インターネットにはもっと詳しいリストがいくつもあります。一例を挙げれば:
MIME タイプがわかれば、データはすぐに使えるのか?
メールとニュースでは、多くの場合、否です。World Wide Web では、たいてい使えます。ここに、Content-Transfer-Encoding:
の必要性が生じるのです。World Wide Web では、データは1バイト8ビットで送られるので、エンコーディングの必要はありません。メールとニュースは、7ビットで送られるので、8ビットを7ビットの中に詰め込まねばなりません。Content-Transfer-Encoding:
は、これがどのように行なわれたかを表示するものです。良く使われるエンコーディングは、uuencode
と base64 ですが、他の方法も存在します。
従って、データが使えるようになるには、まず Content-Type: がわかっていなければならず、Content-Transfer-Encoding: も、もしあれば、わかっている必要があります。両方がわかっている事により、インターネット・アプリケーションは、データを解読し、適切なビューアーや他のプログラムに送ったり、ディスクのファイルとして保存したりする事ができるのです。
NETSCAPE と MIME について調べるには?
Netscape がどのようにして MIME メッセージを扱うか、を知るための最も良い場所は、
http://home.jp.netscape.com/ja/eng/mozilla/3.0/relnotes/unix-3.01.html#MIME
でしょう。(訳注:原文では英語版へのリンクですが、日本語版リリースノートへのリンクに変更しました)
ここでの話題はやや詳細ですが、上記した情報がこの内容を理解する手助けになるでしょう。
WORLD WIDE WEB の MIME については?
この質問は、ブラウザを特定しないと答えられないので、Netscape 製品に関する検討になります。
ブラウザからデータの要求があった場合、World Wide Web サーバーは、データを送る前に、それに関する情報を送ります。例えば、
HTTP/1.0 200 OK Date: Thu, 10 Apr 1997 00:04:30 GMT Server: Apache/1.1.0 Content-type: text/html Set-Cookie: Apache=localhost349860630670983; path=/ Content-length: 2719 Last-modified: Fri, 13 Dec 1996 18:45:59 GMT"Content-type: text/html" に注目してください。これによりブラウザは、次に来るデータはHTML 文書として解釈するべきであるということを知るのです。
別の例を挙げれば、
HTTP/1.0 200 OK Date: Thu, 10 Apr 1997 00:08:51 GMT Server: Apache/1.1.0 Content-type: audio/midi Set-Cookie: Apache=localhost244860630931311; path=/ Content-length: 30178 Last-modified: Wed, 19 Jun 1996 23:28:43 GMTこの例では、ブラウザは音楽ファイルが来ると予告されます。ブラウザは、プラグインを使ったり、ヘルパーアプリケーションを起動したり、ユーザーがこのデータを扱う方法を選択するためのダイアログボックスを表示したりする事ができるのです。
何故 NETSCAPE は *.BLAH を認識できず、IE は認識できるのか? (訳注:blah=ばかばかしい事、たわごと)
Netscape は、様々なプラットフォームやOSからなるネットワーク上で、正しく動作するように設計されています。厳密に言えば、*.blah
はインターネットのあちこちにある様々なプラットフォーム上では、何の意味も持ちません。Netscape
は Content-type: を信用し、ファイルの拡張子を無視する事を選択しました。マイクロソフトのインターネット・エクスプローラーは
Content-type: を無視する傾向があり、要求によって送られた情報の中にあるファイルの拡張子から中身を推測します。Content-type:
を用いてメッセージの内容を特定する事は、World Wide Web テクノロジーの重要な部分です。これにより、ネットワークを構成する色々な機種の要求を満たしながら、より汎用的な方法で内容を伝達する事が可能となるのです。HTTP
の種々のヘッダー・アイテムに対するソフトウェアの動作については、いくつもの
RFC に記載されています。特に、World Wide Web でデータタイプを特定する手段としての
Content-type: の役目については、これらの文書で明確に説明されています。
(訳注:RFC=Request For Comments。インターネットの各種プロトコルに関する標準化仕様を策定するIETFが発行するドキュメントの名称。)
FTP についてはどうか?
FTP はいろいろな点でHTTP と異なっていますが、なかでも、FTP サーバーは
Content-type ヘッダーを送りません。従って、FTP を経由して送られたファイルが、受け手のシステムで特別なアプリケーションで扱われなければならない場合、アプリケーションの選択は拡張子に基づいて行なわれる事になります。システムが異なる場合、その選択が有効でない場合も起こり得ます。幸いにして、この選択が誤っている場合や、いずれにせよファイルをダウンロードしたい場合には、シフト+クリックや他の方法によってダウンロードできる事が普通です。ダウンロードした後、ユーザーはファイルをリネームするなどの手段で、ファイルを適切に扱うことができるでしょう。
なぜ添付ファイルがでたらめなテキストとして表示されるのか?
これは、Content-type: がデータと一致していない場合に生じます。例えば、もしContent-type:
が image/jpeg でなければならないのに text/plain になっている場合、Netscape
は text/plain が正しいものと推測し、エンコードされたデータを表示します。この場合、添付ファイルをディスクに保存し、デコード・ソフトを使ってイメージファイルが使えるようにします。この現象は、Content-Transfer-Encoding:
が正しくない場合にも生じ、Netscape は壊れたイメージのアイコンを表示したり、上記のようなテキストを表示したりします。
もし、Content-Type: が失われたら?
この場合、Netscape はメッセージにエンコードされたデータがあるかもしれないと考え、この情報をデコードできる場合もありますが、できない場合もあります。このような場合、メッセージをディスクに保存し、デコード・ソフトを使用することはできるでしょう。
UUENCODED された文書を送れますか?
ファイルシステムのネーミング方法によって異なります。uuencode されたファイルを、Windows
95/NT の場合は .jpg.uu、UNIX の場合は .jpg.uue として送ると、たいていの場合正しい情報が送られます。残念ながら、この方法は、ファイル名で複数の拡張子が使えるシステムに限定されます。
もっと詳しく知るには?
検索エンジンを使いましょう。この文書を書く際に私もそうしました。RFC
文書は、全てのインターネット問題に関する最終権威です。MIME については、
RFC 2045: (MIME) "Part One: Format of Internet Message Bodies" および RFC
2046: (MIME) "Part Two: Media Types" が最も重要です。検索エンジンを使えば、インターネットの全ての面に関する詳細な文書が見つかるでしょう。多くの場合、ここで私が提示した基本的な概念が役立つと思います。
Content-type: text/html
Location: http://somewhere.domain/.
これらは、使われる際に、ブラウザに対して、ヘッダーが完了し、データが続くという事を警告する新しい2行が続かなければなりません。CGI
プログラムは、データを送るか、ブラウザを別の場所へ導かねばなりません。上の最初の例は、データが続く例です。第二の例は、ブラウザを
http://somewhere.domain/. に誘導する例です。CGI プログラムの例は、World
Wide Web に数多くあります。http://www.yahoo.com/
に行けば、多くの参考文献とアプリケーションが見つかるでしょう。
ブラウザにファイルの拡張子が何かを知らせるには?
これにはちょっとした技が必要です。あなたが使っているURL が、
http://my.domain/cgi-bin/my_CGI_applicationであり、拡張子が .blah なら、
http://my.domain/cgi-bin/my_CGI_application/x.blahを使いましょう。これにより、いくつかのブラウザで拡張子が正しく認識されます。
CGI のファイル名を保持するには?
これは上記の応用です。あなたは、別の CGI アプリケーションにリダイレクトしなければなりません。例えば、
location: http://my.domain/cgi-bin/my_CGI_application_2/my_file.blahここで、my_file.blah が目的のファイル名です。my_CGI_application_2 というアプリケーションが、CGI の PATH_INFO 環境変数からファイル名を読み取り、適切な Content-type: とともに my_file.blah を送ります。
Chuck Simmons
最終更新 1998/11/16
翻訳および編集 池田譲治
The UFAQ Japanese edition is translated & edited by Joji Ikeda.