ByteScope

SVG ファイル形式

Scalable Vector Graphics。XML ベースのベクター画像形式。

MIME タイプ
image/svg+xml
拡張子
.svg
カテゴリ
画像

マジックナンバー(ファイル署名)

`<svg` 要素を含むプレーンテキストの XML(多くは先頭に `<?xml` が付きます)。

SVG 形式について

SVG は画像をベクター図形として XML で記述するため、どんなサイズに拡大してもぼやけず、CSS でスタイル指定やアニメーションもできます。プレーンテキストなのでバイナリのマジックナンバーはなく、先頭付近の XML 宣言か `<svg` 要素で判別します。

ヘッダーの構造(バイト単位)

オフセット長さフィールド意味
03UTF-8 byte-order markEF BB BF。省略可能で、XML が宣言より前に許している唯一のものです。今も拒否する古いパーサやサーバ設定がわずかにあり、それ以外は正しい SVG が描画されない原因として繰り返し登場します。
02UTF-16 byte-order markリトルエンディアンなら FF FE、ビッグエンディアンなら FE FF。UTF-8 のマークと違ってこちらは省略できません。XML は UTF-16 のコンテンツに BOM を要求します。UTF-16 の SVG は珍しく、1 文字 1 バイトを前提にしたツールをことごとく壊します。
05XML declaration opener3C 3F 78 6D 6C、宣言を開始する文字列です。XML は、宣言を書くならドキュメントの本当に先頭になければならないと定めています。つまりオフセット 0、UTF-8 BOM があるならオフセット 3 です。UTF-8 のコンテンツでは省略可能なので、検出器がこれを必須にすることはできません。
05DOCTYPE opener3C 21 44 4F 43。Illustrator や Inkscape の古いファイルは、SVG 1.1 の DTD を指す DOCTYPE で始まります。BOM も宣言もない場合だけオフセット 0 に来て、そうでなければ宣言の直後に置かれます。SVG 2 で DTD は廃止されたので、新しいファイルには付きません。
04Root element start tag3C 73 76 67。これがオフセット 0 に来るのは、BOM も宣言も DOCTYPE も先頭コメントもないファイルだけです。XML はその 4 つすべてを手前に許しているので、オフセットは本当に固定されません。検出器は位置を調べるのではなく、先頭数百バイトからこの文字列を探します。

似た形式との見分け方

紛らわしい形式見分け方
GZIP.svgz は gzip した SVG なので、1F 8B 08 で始まり、読めるマークアップはどこにもありません。サーバは gzip の Content-Encoding ヘッダを付けて送り、ブラウザは透過的に展開します。hex エディタで見れば単なる gzip メンバで、書き手がファイル名を入れていればそれが .svg で終わっています。
XMLSVG は XML なので、汎用の XML 判定はすべて通り、そして何も分かりません。両者を分けるのはルート要素の名前だけです。宣言・DOCTYPE・コメント・処理命令ではない最初のタグが svg 要素でなければなりません。別のルートの中に入れ子になった svg 要素は、SVG ドキュメントではありません。
HTMLHTML5 は svg 要素のインライン記述を許しているので、HTML ページが SVG を識別するのとまったく同じバイト列を含むことがあります。ルートが実際に何かを見てください。先頭に DOCTYPE html があるか html 開始タグがあれば、それは絵を含んでいるだけの HTML で、image/svg+xml ではなく text/html として配信しなければなりません。
PNGバイトレベルでは 89 50 4E 47 と読めるテキストなので取り違えようがないのに、実務では取り違えが絶えません。いくつかのデザインツールの SVG として書き出しが、中身は base64 の PNG を抱えた image 要素 1 つだけ、という SVG を吐くからです。ファイルとしては本物の SVG で、中のグラフィックはラスターのままなので、拡大しても鮮明にはなりません。

よくある壊れ方

  • 野良のアンパサンド。XML のエラー処理は容赦がないので、href 属性の URL の中にエスケープしていない & が 1 つあるだけでドキュメント全体が整形式でなくなり、ブラウザは絵の 95 パーセントを描くのではなく何も描きません。毎回 &amp; と書く必要があります。
  • 名前空間の欠落。ルート要素から http://www.w3.org/2000/svg を指す xmlns 属性を落としても、XML としては正しく解析でき、テキストエディタでも開けますが、どのブラウザでも真っ白になります。手で編集した SVG が突然動かなくなる原因としてはいちばんよくあるものです。
  • エンコーディングの不一致。宣言は UTF-8 と言っているのに、ファイルは Latin-1 や Shift_JIS で保存されている場合です。text 要素が文字化けするか、最初の不正なシーケンスでパーサが中断します。見るべきバイトはヘッダの中ではなく、text 要素の中身のほうです。
  • 途中切れ。閉じ svg タグが途中までしか書かれていないのは致命的な整形式エラーなので、途中で切れた PNG と違って部分的な描画すら見られません。手がかりはファイルの末尾で、無事な SVG は閉じ svg タグと、たいてい改行で終わっています。
  • あるべきでない場所のバイトオーダーマーク。別のエンコーディングを名乗る宣言の手前にあれば矛盾になりますし、HTML ページにインライン展開される SVG の中にあれば、その 3 バイトが目に見える空白になって周囲のレイアウトをずらします。

この形式の現在地

SVG はウェブが唯一合意できたベクター画像形式で、25 年たった今も競合が存在しません。アイコン、ロゴ、グラフ、図解、イラストが SVG で配られるのは、1 ファイルでどの画素密度でも鮮明さを保ち、CSS から色を変えられるからです。2012 年ごろに同じ問題を解いたアイコンフォントは、事実上消えました。SVG が向かないのは写真です。写真をトレースすると、元の JPEG より大きくて描画も遅いファイルができあがります。数千を超えるパスを持つイラストも同様で、要素ごとの DOM のコストがサイズ面の利得を上回ります。スクリプトや外部参照を持てるので、攻撃面としても現役です。ユーザーから受け取ったファイルは、配信し返す前に必ずサニタイズしてください。

SVG ファイルをこのサイトで開く

どれもブラウザ内で動きます。ファイルが端末から出ることはありません。

関連する形式

SVG と混同しやすい形式です。先頭バイトを見比べてください。

形式先頭バイト拡張子
PNG89 50 4E 47 0D 0A.png
XML固定の署名なし.xml
HTML固定の署名なし.html

よくある質問

ファイルのマジックナンバーとは何ですか?

ファイル先頭の数バイトで、名前が何であろうとその形式を示すものです。PNG は必ず 89 50 4E 47 で始まり、ZIP は 50 4B 03 04 で始まります。OS もブラウザも file コマンドも、拡張子を信用せずこのバイト列を読みます。だからファイル名を変えても中身の正体は変わりません。

マジックナンバーを自分で確認する方法は?

macOS や Linux なら xxd -l 16 ファイル名 で先頭 16 バイトが表示されます。Windows なら PowerShell で Format-Hex -Path ファイル名 -Count 16 です。あるいはこのサイトのファイル形式判別ツールにドロップすれば、ローカルでバイト列を読んで形式を教えてくれます。アップロードはありません。

2 つの形式が同じマジックナンバーを持つのはなぜ?

一方が他方の上に作られているからです。docx、xlsx、pptx、apk、jar、epub はすべて中身が ZIP アーカイブなので ZIP の署名で始まり、区別するには内部のエントリを見る必要があります。Java の class ファイルと macOS のユニバーサルバイナリはどちらも CA FE BA BE で始まり、直後のフィールドで見分けます。

マジックナンバーがまったくないファイルもある?

あります。XML、HTML、JSON、SVG、CSV といったテキストベースの形式には固定のバイト署名がないため、構造から判別します。先頭の <?xml 宣言、<svg 要素、あるいは { に続く引用符付きのキーなどです。これは確定ではなく推測なので、このリファレンスではそうした形式をプローブ判別として示しています。

マジックナンバーが一致すればそのファイルは安全?

いいえ。わかるのは形式であって、中身が無害かどうかではありません。正規の PDF や docx でも悪意のあるペイロードを含んでいることがあります。特に拡張子とバイト列が食い違うときに真の形式を知るのは有用な第一段階ですが、マルウェアスキャンではありません。

SVG かもしれないファイルをお持ちですか?ファイル形式判別ツールで調べる — マジックナンバーをローカルで読み取ります。アップロードは一切ありません。またはすべての形式を見る。