プロが教えるわが家の防犯対策術!

MIMEタイプっていらない子なんじゃないんですか?
MIMEタイプはファイルのデータ型をクライント(WEBブラウザ)教えるのが役割のようですが、
これって拡張子で十分なんじゃ・・・・?

例えば.htmlなら誰もがHtmlファイルなんてわかるわけだし
わざわざMIMEタイプいらないんじゃ?

HTMLのメタタグには

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

なんて、わざわざMIMEタイプ宣言する部分があるし、
なぜMIMEタイプが必要なのでしょうか?

A 回答 (6件)

#5 です。



> METAタグの charsetが設定されているのにも関わらず、このような結果になるのは驚きです。
<meta> にはレスポンスヘッダの代替としての役割もあります。
Content-Type: text/html; charset=UTF-8 と <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> は同じなのです。(よく読めばわかると思います)
http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401 …
ただ、HTTPヘッダの代替としての役割を担った全ての <meta> でHTTPヘッダを優先するかはわからないので、とりあえず Content-Type においてはHTTPヘッダが優先されると覚えておいてください。
# 詳しくは知りませんが、キャッシュ制御あたりは実装依存の度合いが強いようです。

当然のことながら通常はHTTPヘッダと <meta> で異なる値と指定しません。
どちらか一方にだけ指定するか、同じ値を指定するように気をつければいいはずですが、
文字コードに関しては間違うと文字化けが発生する危険性があるため、HTML4 に限らず XML 1.0, CSS2 でも厳密に規定されています。
    • good
    • 0

「拡張子はローカルファイルの識別子」「MIME-Type はネットワーク上のファイルの識別子」というところでしょうか。



拡張子はファイルの中身を表していません。
拡張子とはOSが該当ファイルを開くアプリケーションを識別するための名前です。
例えば、test.html というファイルがあったとき、OSは「test.html がHTML文書である」と認識しているわけではありません。
test.html を開くときOSは「test.html がブラウザで開くように関連づけで設定されている」と認識して、ブラウザで開くのです。
関連付けの設定を変更すれば、test.html をメモ帳で開くことも可能です。
ただし、*.html, *.htm はそれぞれ別物として扱いますので、HTML文書の関連づけ設定を変更したい場合は複数の拡張子で関連付け設定を変更する必要があります。

一方、MIME-Type はファイルの中身を表しています。
・text/html … HTML文書
・text/css … CSS文書
これらはRFCで標準化されています。例えば、text/html なら RFC2854 です。
http://www.cam.hi-ho.ne.jp/mendoxi/rfc/rfc2854j. …

MIME-Type をどう扱うかははブラウザが制御しており、拡張子の場合と同じように関連付けの設定を変更することで動作を変更することが可能です。
拡張子が各アプリケーションが思い思いに識別子を規定していたのと違い、MIME-Typeでは標準化されることでブラウザが正しくファイルの中身を判断できるようになりました。
「text/htmlはHTML文書として扱い、text/cssはCSS文書として扱う」と設定するだけでブラウザは正しくそれを認識します。
一方、拡張子の場合は「*.html, *.htm はHTML文書として扱い、*.css はCSS文書として扱う」と設定しなければなりません。
先述のように拡張子はファイルの中身を表していないので、関連付け設定が標準化されていなければ環境毎に表示に違いが出てくるでしょう。
そうでなければ、「Web制作者の環境では期待通りに動作するが、特定のブラウザで閲覧する人だけ不具合が発生する」という事態になりかねません。
規定する拡張子もより多くなります。HTML文書でさえ2つの拡張子があるのですから。

MIME-Typeはファイルの中身しか表しませんが、Content-Typeヘッダでは文字コードも指定できます。
Content-Type: text/html; charset=UTF-8
を受け取ったとき、ブラウザは「それがUTF-8文字コードのHTML文書である」と認識できます。
HTML文書内で <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> とした場合ですが、これは文字コードのみしか認識せず、Content-Typeヘッダで文字コードが指定されていない時に認識します。
Content-Typeヘッダで文字コード指定の記述があれば <meta> は省略可能ですが、通信の発生しないローカルファイルを開くときのために <meta> を書くことが慣習化しているように思います。
ローカルディスク上のファイル test.html を開くとき、OSの関連付け設定によりブラウザで開かれ、<meta> の記述により、文字コードを認識してHTML文書を解析→描画します。

Content-Type: text/html; charset=UTF-8
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
この場合、ブラウザは「それがUTF-8文字コードのHTML文書である」と認識します。
HTTP通信ではサーバから返されたヘッダを認識した後にボディ(HTML文書の内容)を認識します。
必然的に Content-Type ヘッダの優先順位は高くなります。
また、<meta> の場合は記述が後ろの方にあるとブラウザの文字コード自動判定ロジックが先に働き、正常に認識しないこともあるようです。
<meta> を指定する場合は出来るだけ初めの方に指定するのがベターです。
    • good
    • 5
この回答へのお礼

あ~、なるほど、やはり拡張子はファイルとの関連付けだけであって、その関連付けは統一されていないし、関連付けられてないものもあるし、あまりあてにならないんですね・・・

>>Content-Type: text/html; charset=UTF-8
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />

やはりヘッダの優先順位が一番高いんですね。METAタグの charsetが設定されているのにも関わらず、このような結果になるのは驚きです。

ありがとうございます。、

お礼日時:2011/12/04 13:42

拡張子病にかかったことありませんか?


 へんな関連付けをされて、希望するプログラムで開けないとか、mediaplayerじゃなく、quicktimeで開きたいのに・・

 拡張子で動作を決めるのは、Windowsの長所でもあり、同時に最大の欠点なのです。

 htmlと言う拡張子のファイルを開くとき、テキストエディタで開くとき苦労するのはWindowsだからです。
 Windowsが厄介なのは、たとえば拡張子が.htmlのサンプルファイルをダウンロードさせようとしたときに、勝手にブラウザで開いてしまいます。mimeでoctet-streamと指定しているのに・・・
 UNIXでしたら、フォルダーやファイルごとに、このファイルは何で開くか指定できます。Windowsにはそれすら出来ない。・・・ということです。
 すべてのOSに対して、拡張子ではなく、このファイルはどういう種類であるかを知らせるためです。世の中、Windowsと言う陳腐なOSばかりじゃない。


 
    • good
    • 0
この回答へのお礼

確かにありますね!
windowsでファイルを開く際、拡張子によってプログラムを関連付けていますね。

確かにHTMLを開くときメモ帳開いて、ドラッグという行為が必要ですね(汗

ご回答ありがとうございました!

お礼日時:2011/12/04 13:17

まず結論「必ずしも.htmlだけがhtmlを出力するワケでは無い」からです。



たとえばphpやasp等のサーバサイドアプリケーションからはHTMLの他にJSONやXMLをブラウザ側に出力する事があります。
またHTML内で使用する各種アプリケーション(FlashやPDF等)の判別などにもブラウザやWebサーバが使用したりします。
質問のHTMLのmetaタグですが
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
これにはtext形式のhtmlで、文字コードはUTF8を使用しているのがわかります。
    • good
    • 0
この回答へのお礼

ご回答ありがおうございます!
>>たとえばphpやasp等のサーバサイドアプリケーションからはHTMLの他にJSONやXMLをブラウザ側に出力する事があります。
そうみたいですね!!NO2さんの回答を見てわかりました!
インターネットの世界には色々な拡張子が飛び交っているんですねー。

ありがとうございます!

お礼日時:2011/12/04 13:09

 本来のフルスペルを見ると、もともとの存在意義が見えてきます。


 Multipurpose Internet Mail Extension(多目的インターネットメール拡張‎)の略がMIMEです。

 もともとメールでは、本来、英数記号しか使えません。そう。メールで日本語を使うなんてあり得なかったわけです。
 メールには、英数記号のテキストしか含むことができません。添付ファイル?それってなんですか?
 というのが、このMIME規格が出来るまでのメールでした。

 今では、メール本文は日本語で書きますし、写真だってメールで送れます。
 これが出来るようにするための、インターネットのメール規約の拡張の為に作られたのが、このMIME規格です。
 あなたの質問に出てくるcontent-typeは、MIME規格の中のMIMEタイプの指定の為のヘッダです。
 そのほかにも、いろいろなヘッダが定義されています。
 例えば、Content-Transfer-Encoding。これは、簡単に言うと、メールで使われている文字をどう解釈するかを指定しています。これが指定できるようになったおかげで、日本語のメールが不自由なく使えるようになりました。
 他にも、添付ファイルに対する規約などが、この規格で定められています。
 当然、今でも立派な現役の規格です。これがなければ、日本語のメールも添付ファイルの使用もなにも出来なくなります。

 最近では、htmlメールなんてのもありますよね。メールには、拡張子はありません。なにで、本文のコンテンツの種類を判断するのか。そう。contents-typeヘッダより判定します。
 ほら、必要な子でしょ?

 もうひとつ、今度は、webページの世界での必要性を見てみましょう。
 静的なページを http://****.com/****/****.html というURLで表示している限りは、ちゃんとブラウザは、どんな拡張子のファイルだったのかを、要求したURLから知ることが出来ます。

 では、http://www.google.co.jp/ というURLならどうですか?立派に、ちゃんと通用するURLです。打つと、グーグルのトップページが出てきます。このURLの拡張子はなんですか?

 もうひとつ。http://ja.wikipedia.org/wiki/Multipurpose_Intern …
 このURLはどうでしょう?拡張子はなに?(ちなみに、wikiのMIME規格に関する記事のページです。一読してみると良いでしょう。)
 
 ほかにも、http://www.microsoft.com/ja-jp/default.aspx 。こんな例もあります。
 ファイルの拡張子は、aspxです。この拡張子はなを意味しますか?帰ってくるファイルは何で書かれていますか?
 このURLは、マイクロソフトのトップページのURLです。帰ってくるデータは、たんなるHTMLファイルです。拡張子が付いていてさえ、この文書がHTMLであることはURLからは識別できませんね。当然です。この拡張子は、サーバーサイドのプログラムを呼び出していますから。プログラムの様式を指定している拡張子なわけです。帰ってくる文書を表す拡張子ではありません。
 今回のURLは、偶然、HTMLファイルが帰ってきますが、同じようなURLでも、状況に応じて、ファイルタイプさえ変わることがあります。何が帰ってくるかはサーバーサイドのプログラムの挙動次第です。
 これでは、ブラウザは、帰ってくる文書をどうやって表示するのかを知るスベはありません。

 ほら、やっぱり、content-typeは、必要な子でした。
 ちなみに、content-typeは、文書本体より前に、ヘッダとしてブラウザに渡されます。だから、本文を見るより前に、ブラウザはちゃんと文書本体の形式を識別できるようになるんですね。

 まぁ、入門をやっている間は、単なる意味の無い暗号で(または、htmlを書く時の「おまじない」と表現します。)、意味を中途半端に知るようになると、「いらない子」になります。
 でも、本当にいろいろなことをやれるようになりやり始めると、やっと、この宣言の本当の意味がわかる。という典型です。
 本当の意味がわかるまでは、「おまじない」と呼ばれる、この類の宣言は、プログラム言語をはじめとするコンピュータ相手の規格では結構多いですね。
    • good
    • 5
この回答へのお礼

ありがとうございます!非常にわかりやすいご回答で参考になりました!
むむむcontent-typeいる子ですね・・
非常に参考になりました!ありがとうございます!

お礼日時:2011/12/04 13:03

その文章の「MIMEタイプ」と「拡張子」を入れ替えても成立するということに気付ければ一歩成長だよ。

頑張って。
ちなみに、MIMEタイプはもともとEメール用のもので、HTTPでの適用は派生なんだけどね。


ファイルが「何であるか」は中身で決まる。拡張子なんて補助でしかない。たとえsample.htmlとついていても中身が画像のバイナリデータであればそれは「拡張子の間違っている画像ファイル」なわけ。質問者さんにとって、それでもsample.htmlは「HTMLファイル」ですか?

HTMLに書くmetaタグも補助。本来はファイルの中身でMIMEタイプが判断されるものなんだけどうまくいかないことがあるからファイル内に書くことでもう一度教えているだけ。現にXHTML1.1ではmeta使えないしね。まあ使うのは質問者さんの勝手ですが、補助輪しかない自転車に乗るのは私は嫌です。

この回答への補足

ごめんなさい。でもそのファイルをどのプログラムで開くのは
拡張子やmimeタイプで決まっている訳ですよね(もちろんファイルのデータは結局中身で決まる訳ですが・・・)。
つまり、なぜファイルを開く為のプログラムを判別する要素としてmimeタイプと拡張子があるんでしょうか?

補足日時:2011/12/04 12:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!