拡張子はただの名札なのか

中級の解説は準備中のため、中級の内容を表示しています。

概要 — まず全体をつかむ

初級では「名札(拡張子)・中身(0と1)・読み方(形式)・担当(アプリ)」の4点セットを見ました。ここでは中身側の証拠読み方の決まりの実名に踏み込みます。読み終わる頃には、文字化けと「開けないファイル」を理屈で切り分けられるはずです。

用語には「※1・※2…」と番号を付けて、各セクション末尾の「登場人物メモ」で説明します。

アニメーション『ダブルクリックの3秒』を開く
あなたOSアプリファイルの中身
  • あなたファイルをダブルクリックする人
  • OS名札(拡張子)を見て、開く係を決める世話役
  • アプリそのファイルの「読み方」を知っている担当者
  • ファイルの中身実体はどれもただの0と1の列。読み方を知る係が必要
「▶ 再生」で通しで見るか、「次へ」で1手ずつ進めてください。
0 / 7

詳細 — 1段階ずつ追う

① 名札を見る

🎬 アニメーション『ダブルクリックの3秒』の のところです!

名札は拡張子だけではありません。世界には3種類の「種別の伝え方」があります:

  1. 拡張子 — ファイル名の一部。OSのダブルクリック判定が見る(自己申告)
  2. マジックナンバー※1 — ファイル先頭の決まったバイト列。中身側の証拠で、file コマンドやアップロード検証が見る
  3. MIMEタイプ※2 — Webの世界の種別宣言。HTTPレスポンスの Content-Type ヘッダで配信側が宣言し、ブラウザはこれに従う

登場人物メモ(※の説明):

  • ※1 マジックナンバー — PNGなら 89 50 4E 47、ZIPなら 50 4B、PDFなら %PDF など、形式ごとの署名。名札と違って中身に埋まっている
  • ※2 MIMEタイプtext/html image/png のような「大分類/小分類」表記。名前の由来はメールだが、今はWeb全体の標準

⚠️ イレギュラー(3つの証言が食い違うとき):

  • 名札と中身の不一致 — 拡張子は .png なのに先頭バイトはJPEG、のようなファイルは検証のあるシステムで弾かれる。逆に検証しないシステムは偽装ファイルの侵入口になる
  • ブラウザの推測(MIMEスニッフィング) — 宣言が曖昧なとき、ブラウザが中身から推測する機能。便利だが「テキストのふりをした攻撃コード」の実行につながるため、無効化を宣言するヘッダ(X-Content-Type-Options: nosniff)が存在する

② 対応表を引く

🎬 アニメーション『ダブルクリックの3秒』の ③〜④ のところです!

OSの対応表と、その周辺の実装です:

  1. OSは「拡張子 → 既定のアプリ」の対応表を持つ(Windowsはレジストリ、macはLaunchServicesが管理)
  2. 「常にこのアプリで開く」は、この表の1行の書き換え
  3. アプリをインストールすると、アプリが「自分は .pdf を開けます」と候補登録する——既定を奪い合う通知が出るのはこのため
  4. ダブルクリック以外の入り口(コマンドラインや「プログラムから開く」)は表を経由せず、任意のアプリに任意のファイルを渡せる

⚠️ イレギュラー(対応表まわりの事故):

  • 既定アプリの乗っ取り — インストール時に関連付けを一斉に自分へ向けるお行儀の悪いソフトがある。急に開くアプリが変わったらここを疑う
  • 二重拡張子 + 非表示設定 — 初級で見た「請求書.pdf.exe」。OSの既定が拡張子非表示だと成立してしまうので、表示設定が対策になる

③ アプリが解読する

🎬 アニメーション『ダブルクリックの3秒』の ⑤〜⑦ のところです!

「読み方の決まり」の実名はファイルフォーマット仕様です。解読には層があります:

  1. まず大きくテキストバイナリ※1 かに分かれる
  2. テキストの解読には文字コード※2 が要る——「このバイト列はこの文字」の対応表。UTF-8 が現在の標準で、Shift_JIS などの旧規格と取り違えると文字化けになる(データは無傷、読み方の取り違え)
  3. バイナリは形式ごとの仕様書どおりに解読する。多くの形式は圧縮※3 も組み込んでいて、可逆(ZIP・PNG)と非可逆(JPEG・MP3)で性格が違う
  4. 変換(.jpg → .png)とは、デコードして別の決まりで再エンコードすること。改名では起きない

登場人物メモ(※の説明):

  • ※1 テキスト / バイナリ — 文字コード表だけで人間が読める形式か、専用の仕様書が要る形式かの大別
  • ※2 文字コード — バイト列と文字の対応表。UTF-8 / Shift_JIS / EUC-JP など。取り違え=文字化け
  • ※3 可逆 / 非可逆圧縮 — 完全に戻せる圧縮(ZIP・PNG)と、知覚しにくい情報を捨てて縮める圧縮(JPEG・MP3)。非可逆は保存のたびに劣化が積む

⚠️ イレギュラー(解読の事故):

  • 文字化け — 原因は必ず「書いた文字コード ≠ 読んだ文字コード」。正しいコードで開き直せば直る(データは壊れていない)
  • JPEGの再保存劣化 — 非可逆圧縮を重ね掛けするたび情報が捨てられる。編集の元データはPNG等の可逆形式で持つのが定石
「fileコマンド」で中身の正体を見る

Linux/Macのターミナルで file 名前 と打つと、拡張子を無視してマジックナンバーから種別を判定してくれます。cat.txt に改名した画像も JPEG image data と見破ります。名札(拡張子)・中身(マジックナンバー)・読み方(フォーマット)が別物であることを、手元で1分で確認できる実験です。

まとめ——種別の証言は名札(拡張子)/ 中身の署名(マジックナンバー)/ Webの宣言(MIMEタイプ)の3系統あり、食い違いこそがトラブルと攻撃の源でした。そして解読の最下層には文字コードと圧縮がいる。「開けない・化ける・劣化する」は全部、この地図のどこかで説明がつきます。

関連する知識

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. テキストファイルが「文字化け」する原因として正しいものはどれ?

2. マジックナンバー(ファイル先頭の署名バイト)の説明として正しいものはどれ?

3. Webの世界でファイル種別を伝える「MIMEタイプ(Content-Type)」と拡張子の関係はどれ?

4. 「cat.jpg を cat.png に改名する」ことと「画像アプリで PNG形式として保存し直す」ことの違いはどれ?

5. JPEGやMP3が使う「非可逆圧縮」の説明として正しいものはどれ?

6. 圧縮の手順を逆にたどれば元の完全なデータへ戻せる「可逆圧縮」の例の組み合わせはどれ?

7. 解読の最初の大きな分かれ道である「テキストとバイナリ」の違いとして正しいのはどれ?

8. Linux や Mac のターミナルで、拡張子を無視してファイル先頭のマジックナンバーから種別を判定するコマンド名を答えてください。