-*-coding-*-

-*- coding -*-

[8] -*- coding -*- は、 テキストファイル文字コードを指定するものです。

[13] coding の値には coding system を指定できます。

[14] Emacscoding system は、文字コード改行コードを組合せた概念です。 文字コードの名称または文字コード改行コードを組合せた名称を記述できます。 coding system

文脈

-*-

[9] Emacs では -*- 局所変数を記述できます。 -*- ファイルの先頭 (shebang があればその次) のに記載します。 -*-

[10] 記述できる特別な局所変数の1つが coding です。

[18] UTF-16UTF-32 などでも機能するのかは定かではありません。

局所変数群並び

[11] Emacs では局所変数群並び局所変数を記述できます。 局所変数群ファイルの末尾に記載します。 局所変数群並び

[12] 記述できる特別な局所変数の1つが coding です。

[17] 局所変数群UTF-16 のような組合せが機能するのかは定かではありません。

複数個の指定

[15] 局所変数は複数個記述できます。 局所変数

[16] coding が複数個指定されたとき適当に動作するかどうかは定かではありません。 特に、矛盾する値が指定されたときの挙動は不明瞭です。

マジックコメントによるスクリプトエンコーディングの指定 (Ruby)

[1] Ruby ではスクリプトエンコーディングの指定にマジックコメントを使えます。 >>2

[20] 構文として、

などがあります。 >>2

[27] 「など」が何を指すのかは定かではありません。

[28] >>20マジックコメントは、 1行目に置くことができます。ただし 1行目が shebang のときは、 その次の行に置くことができます。 >>2

[29] ここで、 shebang

#!/bin/sh
exec ruby19 -x "$0" "$@"
#!ruby
# coding: utf-8

のような場合も想定され、 -x が指定された場合に #! で始まり ruby を含むshebang になるとされています。 >>2 これがどういうことかドキュメント上明らかではありませんが、 1行目が shebangruby でない場合は、 rubyshebang を探し、それを shebang とみなした次の魔法注釈である、 ということでしょうか。 shebang がかなり後ろのになることも考えられますが、 どこまで探すかの制限があるのかどうか、ドキュメント上明らかではありません。

[31] 現行ドキュメントによると、魔法注釈encoding 指令符号化を表すのであり、 coding はその別名と説明されています。 >>30

[32] また、 -*- 構文は通常1行1指令で書かれる # encoding: 構文を複数指令まとめて1行にできる別構文とされています。 >>30

[33] これによれば -*- には coding だけでなく encoding とも記述できます。また、他の指令も記述できます。 ただし、それらのうち Emacs と同等に解釈されるのはおそらく coding だけです。

[36] 値として期待されるのは Ruby が認識するエンコーディングの名前のようです。 Emacscoding-system の名前とは主要な文字符号化の名前に於いて重なりますが、 同一ではありません。

[2] 多言語化 (Ruby 1.9.3) () http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fm17n.html#magic_comment

マジックコメントを使うことにより Ruby 実行系にスクリプトエンコーディングを 伝えることができます。マジックコメントとはスクリプトファイルの1行目に書かれた

# coding: euc-jp

という形式のコメントのことです。1 行目が shebang である場合、マジックコメントは 2 行目に 書くことができます(それ以降の行ではいけません。無視されます)。上の形式以外にも

# encoding: euc-jp

# -*- coding: euc-jp -*-

# vim:set fileencoding=euc-jp:

などの形式を解釈します。

#!/bin/sh

exec ruby19 -x "$0" "$@"

#!ruby

# coding: utf-8

このように -x オプションを使っている場合には「#! で始まり、ruby がある行」 の次の行に書きます。


[4] pod にも # ENCODING: を書く流儀 (非標準) があるようです。 =encoding

[34] 標準の方法は =encoding です。

[35] Ruby との関連は不明です。大文字と小文字の違いがありますが、 Ruby, pod のどちらとも、少なくてもドキュメント上は、 大文字と小文字を区別しないとは説明されていません。

魔法注釈による符号化の指定 (Python)

[37] Python では PEP 263 の提案により符号化魔法注釈として記述できます。 >>19

[38] 正規表現

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

に一致するとき、捕獲された部分が符号化の名前です。 >>19

[39] これは最初ので検査され、一致しなければ2つ目ので検査されます。 >>19

[40] 文言通り解釈すると、最初のに何らかの Python のコードがあり、 2行目に魔法注釈があることも認められているようです。 本来の意図は shebang を認めることと思われますが。

[43] 次のような指定が想定されています。 >>19

[41] ファイルの先頭に UTF-8 BOM を置くことができ、 その場合、指定された符号化utf-8 でなければなりません。 そうでなければエラーとなります。 >>19

[42] 指定された符号化が認識できないとき、エラーとなります。 >>19

[50] この方法は Emacs, Vim の一般的な指定方法に対応可能であり、 Ruby の一般的な指定方法とも同等ですが、 厳密な評価をしないかわりに簡潔に符号化名を取り出すことができます。 EmacsVim の機能をフル活用して複雑な記述をしている場合は誤認する可能性がありますが、 そんなことはほとんど起こらないだろうと割り切っているのでしょう。

関連

Emacsにおける文字コード

[5] vim: も参照。

メモ