[8]
-*- coding -*-
は、
テキストファイルの文字コードを指定するものです。
[13]
coding
の値には
coding system
を指定できます。
[14]
Emacs の coding system は、文字コードと改行コードを組合せた概念です。
文字コードの名称または文字コードと改行コードを組合せた名称を記述できます。
-*- 行[9]
Emacs では -*- 行に局所変数を記述できます。
-*- 行はファイルの先頭 (shebang があればその次) の行に記載します。
-*-
[11]
Emacs では局所変数群並びに局所変数を記述できます。
局所変数群はファイルの末尾に記載します。
[16]
coding が複数個指定されたとき適当に動作するかどうかは定かではありません。
特に、矛盾する値が指定されたときの挙動は不明瞭です。
[1] Ruby ではスクリプトエンコーディングの指定にマジックコメントを使えます。 >>2
[20] 構文として、
# coding: エンコーディング# encoding: エンコーディング# -*- coding: エンコーディング -*-# vim:set fileencoding=エンコーディング:などがあります。 >>2
[28] >>20 のマジックコメントは、 1行目に置くことができます。ただし 1行目が shebang のときは、 その次の行に置くことができます。 >>2
#!/bin/sh exec ruby19 -x "$0" "$@" #!ruby # coding: utf-8
のような場合も想定され、 -x が指定された場合に
#! で始まり ruby を含む行が shebang になるとされています。
>>2
これがどういうことかドキュメント上明らかではありませんが、
1行目が shebang で ruby でない場合は、
ruby の shebang を探し、それを shebang
とみなした次の行が魔法注釈である、
ということでしょうか。
shebang がかなり後ろの行になることも考えられますが、
どこまで探すかの制限があるのかどうか、ドキュメント上明らかではありません。
[31]
現行ドキュメントによると、魔法注釈の
encoding
指令が符号化を表すのであり、
coding
はその別名と説明されています。 >>30
[32]
また、 -*- 構文は通常1行1指令で書かれる # encoding:
構文を複数指令まとめて1行にできる別構文とされています。 >>30
[33]
これによれば -*- には coding だけでなく encoding
とも記述できます。また、他の指令も記述できます。
ただし、それらのうち Emacs と同等に解釈されるのはおそらく
coding
だけです。
[36] 値として期待されるのは Ruby が認識するエンコーディングの名前のようです。 Emacs の coding-system の名前とは主要な文字符号化の名前に於いて重なりますが、 同一ではありません。
マジックコメントを使うことにより 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: を書く流儀 (非標準) があるようです。
[35] Ruby との関連は不明です。大文字と小文字の違いがありますが、 Ruby, pod のどちらとも、少なくてもドキュメント上は、 大文字と小文字を区別しないとは説明されていません。
[37] Python では PEP 263 の提案により符号化を魔法注釈として記述できます。 >>19
^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)
に一致するとき、群で捕獲された部分が符号化の名前です。 >>19
[39] これは最初の行で検査され、一致しなければ2つ目の行で検査されます。 >>19
# coding=符号化名# This Python file uses the following encoding: utf-8#!/usr/local/bin/python # coding: latin-1
#!/usr/bin/python # -*- coding: 符号化名 -*-
#!/usr/bin/python # -*- coding: latin-1 -*-
#!/usr/bin/python # vim: set fileencoding=符号化名 :
[41]
ファイルの先頭に UTF-8 BOM を置くことができ、
その場合、指定された符号化は utf-8 でなければなりません。
そうでなければエラーとなります。
>>19
[42] 指定された符号化が認識できないとき、エラーとなります。 >>19
[50] この方法は Emacs, Vim の一般的な指定方法に対応可能であり、 Ruby の一般的な指定方法とも同等ですが、 厳密な評価をしないかわりに簡潔に符号化名を取り出すことができます。 Emacs や Vim の機能をフル活用して複雑な記述をしている場合は誤認する可能性がありますが、 そんなことはほとんど起こらないだろうと割り切っているのでしょう。