<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Windows</anchor> の世界でよく使われているファイル形式です。
悪名高い <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WIN.INI</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SYSTEM.INI</anchor> を筆頭に、
各種<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応用</anchor>の設定を保存するのが主な用途です。</p><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Win32</anchor> の治世になってからは INI ファイルの代わりに
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レジストリ</anchor>に設定情報を保存することが推奨されてます。
しかし <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Win32API</anchor> でも INI ファイルを扱う関数は依然として
用意されています (古い時代のものゆえ結構制限があるけど
(けち臭いことせずなおせよ))。で、レジストリ・データベースは
汚くなるのが嫌われる(笑)ので、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">無料ソフトウェア</anchor>を中心に
根強い人気(謎)があります。</p><p>また、その他の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">INFファイル</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターネット・ショートカット</anchor>
の形式にも用いられているなど、 Windoze の逝きもとい生き続ける限り
不滅のデータ形式かもしれません(藁)。</p><p>正式な仕様はしりません。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">M$</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SDK</anchor> にでもついてるんでしょうか?
最近は無料で見れるらしいですが (いい時代になったもんです。)
とても見る気になりませんな・・・。</p><p>以下で使う用語は、 Win32API の関数名の定義なんかに出てくる
よーなのとか、それを使った実装とかから推定した名称に、
必要に応じてでっちあげた用語を補っております。
どーせ M$ のことだから、用語に一貫性なんてないでしょうし、
別にいいでしょ? (その内ネガチブなんとかとかなんとか♭って名前で
復活するかもよ?)</p><p>もちろん、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BNF</anchor> もでっち上げです。</p><section><h1>構造</h1><ol><li>ini-document = [preamble] *section</li><li>comment = *WSP [ &quot;;&quot; *ctext ]</li><li>ctext = %x00-09 / %x0B-0C / %x0E-FF</li></ol><p>基本的には、節 section と呼ばれる領域が連なった構造に
なってます。一番最初に、どの節にも属さないデータが
入ることがあります。「レジストリの項目 (*.reg)」という
形式では、「REGEDIT4」みたいに、版情報が入ったりします。</p><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>はてきとーです。その動いている Windoze
が使っているもの。つまり可搬性が無い・・。
昔昔のそういう時代に設計されたんですからしゃーないですが。</p><p>注釈 comment は、大体どこでも書けます。ただ、処理系によっては
注釈をちゃんと処理せず、値の一部にするかもしれません。</p><p>行末の WSP はたぶん無視されます。</p></section><section><h1>前書き preamble</h1><ol><li>preamble = section-content</li></ol><p>どの節にも属さない最初の部分を、(正式な名前があるのか
知りませんが) 前書きと呼ぶことにします。</p><p>前書きの中身は、他の節とかわりありません。
前書きはばっさり省略可能です。</p></section><section><h1>節 section</h1><ol><li>section = section-name section-content *empty-line</li><li>section-name = &quot;[&quot; stext &quot;]&quot; [comment] CRLF</li><li>stext = %x00-5B / %x5D-FF / obs-stext</li><li>obs-stext = &quot;[&quot; / &quot;]&quot;</li><li>section-content = entry-list / line-list</li><li>empty-line = [comment] CRLF</li></ol><p>INI ファイルの主となる部分です。各ファイルに任意の個数
入れられます。 (Win32API 的には個数制限があったかも。
それから、中身の大きさ制限とかもあったな・・・。)</p><p>節名には、 &quot;[&quot; や &quot;]&quot; を入れると、 Win32API はいかれた
かもしれません。とはいえその辺触ってたのは昔の話なんで、
よく覚えてません。なんせ、使わないほうがよさげ。</p><p>節は入れ子に出来ません。どうしても必要なら節名を工夫して擬似的に
するとか。</p><p>節の中身は、通常は行ごとに名前=値なんですけど、
INF ファイルとかで、そうでないこともしばしばあります。</p><p>節の中身の形式を知る方法はありません。
実装(用途)ごとに決めうちでしょう。</p><p>節の終わりには、任意個の空行を入れられます。これは
人間編集者のみやすさのためで、実装は節の内容一部の空行
として扱うものもあるみたいです。</p></section><section><h1>項目達 entry-list</h1><ol><li>entry-list = *(entry / empty-line)</li><li>entry = entry-name &quot;=&quot; entry-value [comment] CRLF / obs-entry</li><li>obs-entry = entry-name *WSP &quot;=&quot; *WSP entry-value [comment] CRLF</li><li>entry-name = *etext / quoted-string</li><li>entry-value = *etext / quoted-string</li><li>etext = %x00-08 / %x0B-0C / %x0E-1F / %x21 / %x23-3A / %x3C / %x3E-5A / %x5C-FF  ;; OCTET except CR, LF, WSP, &quot;;&quot;, &quot;=&quot;, &quot;[&quot;</li><li>quoted-string = &lt;&quot;&gt; qtext &lt;&quot;&gt;</li><li>qtext = %x00-08 / %x0B-0C / %x0E-1F / %x21 / %x23-%x5B / %x5D-FF / quoted-pair</li><li>quoted-pair = &quot;\&quot; &lt;&quot;&gt;</li></ol><p>正統的(?)な節の中身です。</p><p>quoted-pair は、「レジストリの項目」で使われてます。
&lt;&quot;&gt; 以外の文字にも使えるのかは不明です。</p></section><section><h1>行達 line-list</h1><ol><li>line-list = *(line / empty-line)</li><li>line = *(lcontent / quoted-string) [comment] CRLF</li><li>lcontent = *ltext</li><li>ltext = %x00-%x09 / %x0B-0C / %x0E-21 / %x23-3A / %x3C-5B / %x5D-FF  ;; OCTET except CR, LF, &quot;;&quot;, &quot;[&quot;</li></ol><p>構造の無い行の連続です。まあ構造は無いとは言っても、
実際には命令の集合だったり、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CSV</anchor> だったり、
その場その場で色々です。下手に構造を仮定して構文解析すると
危険かも。</p><p>実装によっては注釈[行]を認めていなかったりだし。</p></section><section><h1>応用</h1><figure class="short list"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> </figcaption><ul><li><code>.INF</code></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターネットショートカット</anchor></li><li><code>desktop.ini</code></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SCF</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WindowsExplorerCommand</anchor></li></ul></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> 
他にも沢山ある。</p></section><section><h1>類似</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">INIファイル</anchor>と類似の構文のもの:
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EditorConfig</anchor></p></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite xml:lang="en-us">Cloanto Implementation of INI File Format</cite>
(<time>2014-03-06 00:25:20 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://cloanto.com/specs/ini/">http://cloanto.com/specs/ini/</anchor-external></p></section></body></html>