[8] 
[DFN[[CODE[-*- coding -*-]]]]
は、
[[テキストファイル]]の[[文字コード]]を指定するものです。

* 値

[13] 
[CODE[coding]]
の値には
[[coding system]]
を指定できます。


[14] 
[CITE[Emacs]] の [[coding system]] は、[[文字コード]]と[[改行コード]]を組合せた概念です。
[[文字コード]]の名称または[[文字コード]]と[[改行コード]]を組合せた名称を記述できます。
[SEE[ [[coding system]] ]]

* 文脈

** [CODE[-*-]] 行

[9] 
[CITE[Emacs]] では [CODE[-*-]] [[行]]に[[局所変数]]を記述できます。
[CODE[-*-]] [[行]]は[[ファイル]]の先頭 ([[shebang]] があればその次) の[[行]]に記載します。
[SEE[ [CODE[-*-]] ]]

[10] 
記述できる特別な[[局所変数]]の1つが [CODE[coding]] です。

[18] 
[[UTF-16]] や [[UTF-32]] などでも機能するのかは定かではありません。

** 局所変数群並び

[11] 
[CITE[Emacs]] では[[局所変数群並び]]に[[局所変数]]を記述できます。
[[局所変数群]]は[[ファイル]]の末尾に記載します。
[SEE[ [[局所変数群並び]] ]]

[12] 
記述できる特別な[[局所変数]]の1つが [CODE[coding]] です。

[17] 
[[局所変数群]]と [[UTF-16]] のような組合せが機能するのかは定かではありません。

** 複数個の指定

[15] 
[[局所変数]]は複数個記述できます。
[SEE[ [[局所変数]] ]]

[16] 
[CODE[coding]] が複数個指定されたとき適当に動作するかどうかは定かではありません。
特に、矛盾する値が指定されたときの挙動は不明瞭です。

* マジックコメントによるスクリプトエンコーディングの指定 (Ruby)

[1] 
[[Ruby]] では[[スクリプトエンコーディング]]の指定に[[マジックコメント]]を使えます。
[SRC[>>2]]

[20] 
構文として、

- [22] [CODE[[DFN[# coding:]] [VAR[エンコーディング]]]]
- [21] [CODE[[DFN[# encoding:]] [VAR[エンコーディング]]]]
- [23] [CODE[# -*- [[coding:]] [VAR[エンコーディング]] -*-]]
-- [25] [CITE[Emacs]] の [CODE[-*-]] [[行]]
- [24] [CODE[# [[vim:]]set [[fileencoding]]=[VAR[エンコーディング]]:]]
-- [26] [CITE[Vim]] の[[モード行]]

などがあります。 [SRC[>>2]]

;; [27] 「など」が何を指すのかは定かではありません。

[28] 
>>20 の[[マジックコメント]]は、
1行目に置くことができます。ただし 1行目が [[shebang]] のときは、
その次の行に置くことができます。
[SRC[>>2]]

[29] 
ここで、 [[shebang]] は

>
[PRE[
#!/bin/sh
exec ruby19 -x "$0" "$@"
#!ruby
# coding: utf-8
]PRE]

のような場合も想定され、 [CODE[-x]] が指定された場合に
[CODE[#!]] で始まり [CODE[ruby]] を含む[[行]]が [[shebang]] になるとされています。
[SRC[>>2]]
これがどういうことかドキュメント上明らかではありませんが、
1行目が [[shebang]] で [CODE[ruby]] でない場合は、
[CODE[ruby]] の [[shebang]] を探し、それを [[shebang]]
とみなした次の[[行]]が[[魔法注釈]]である、
ということでしょうか。
[[shebang]] がかなり後ろの[[行]]になることも考えられますが、
どこまで探すかの制限があるのかどうか、ドキュメント上明らかではありません。

[31] 
現行ドキュメントによると、[[魔法注釈]]の
[DFN[[CODE[encoding]]]]
[[指令]]が[[符号化]]を表すのであり、
[DFN[[CODE[coding]]]]
はその別名と説明されています。 [SRC[>>30]]

[32] 
また、 [CODE[-*-]] 構文は通常1行1[[指令]]で書かれる [CODE[# encoding:]]
構文を複数[[指令]]まとめて1行にできる別構文とされています。 [SRC[>>30]]

[33] 
これによれば [CODE[-*-]] には [CODE[coding]] だけでなく [CODE[encoding]]
とも記述できます。また、他の[[指令]]も記述できます。
ただし、それらのうち [CITE[Emacs]] と同等に解釈されるのはおそらく
[CODE[coding]]
だけです。


[36] 
値として期待されるのは [[Ruby]] が認識する[[エンコーディング]]の名前のようです。
[CITE[Emacs]] の [[coding-system]] の名前とは主要な[[文字符号化]]の名前に於いて重なりますが、
同一ではありません。


[REFS[

[FIG(quote)[
[FIGCAPTION[
[2] [CITE@ja-JP[多言語化 (Ruby 1.9.3)]]
([TIME[2015-12-14 00:26:12 +09:00]])
<http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fm17n.html#magic_comment>
]FIGCAPTION]

> マジックコメントを使うことにより 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 がある行」 の次の行に書きます。

]FIG]

- [30] 
[CITE@en[comments - Documentation for Ruby 3.5]], [TIME[2025-11-01T13:20:22.000Z]], [TIME[2025-11-06T14:00:29.582Z]] <https://docs.ruby-lang.org/en/master/syntax/comments_rdoc.html#label-encoding+Directive>


]REFS]

-*-*-

[4] [[pod]] にも [CODE[# ENCODING:]] を書く流儀 (非標準) があるようです。
[SEE[ [[=encoding]] ]]

;; [34] 標準の方法は [CODE[=encoding]] です。

[35] [[Ruby]] との関連は不明です。[[大文字と小文字]]の違いがありますが、
[[Ruby]], [[pod]] のどちらとも、少なくてもドキュメント上は、
[[大文字と小文字]]を区別しないとは説明されていません。


* 魔法注釈による符号化の指定 (Python)

[37] 
[[Python]]
では
[DFN[PEP 263]]
の提案により[[符号化]]を[[魔法注釈]]として記述できます。
[SRC[>>19]]

[38] 
[[行]]が[[正規表現]]

>
[PRE[
^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)
]PRE]

に一致するとき、[[群]]で[[捕獲]]された部分が[[符号化]]の名前です。
[SRC[>>19]]

[39] 
これは最初の[[行]]で検査され、一致しなければ2つ目の[[行]]で検査されます。
[SRC[>>19]]

;; [40] 文言通り解釈すると、最初の[[行]]に何らかの [[Python]] のコードがあり、
2行目に[[魔法注釈]]があることも認められているようです。
本来の意図は [[shebang]] を認めることと思われますが。


[43] 次のような指定が想定されています。 [SRC[>>19]]

- [44] [CODE[# coding=[VAR[符号化名]]]]
- [48] [CODE[# This Python file uses the following encoding: utf-8]]
- [49] 
[PRE[
#!/usr/local/bin/python
# coding: latin-1
]PRE]
- [45] 
[PRE[
#!/usr/bin/python
# -*- coding: [VAR[符号化名]] -*-
]PRE]
- [47] 
[PRE[
#!/usr/bin/python
# -*- coding: latin-1 -*-
]PRE]
- [46] 
[PRE[
#!/usr/bin/python
# vim: set fileencoding=[VAR[符号化名]] :
]PRE]






[41] 
ファイルの先頭に [[UTF-8]] [CN[BOM]] を置くことができ、
その場合、指定された[[符号化]]は [CODE[utf-8]] でなければなりません。
そうでなければエラーとなります。
[SRC[>>19]]

[42] 
指定された[[符号化]]が認識できないとき、エラーとなります。
[SRC[>>19]]

[50] 
この方法は 
[CITE[Emacs]],
[CITE[Vim]]
の一般的な指定方法に対応可能であり、
[[Ruby]]
の一般的な指定方法とも同等ですが、
厳密な評価をしないかわりに簡潔に[[符号化名]]を取り出すことができます。
[CITE[Emacs]] や [CITE[Vim]]
の機能をフル活用して複雑な記述をしている場合は誤認する可能性がありますが、
そんなことはほとんど起こらないだろうと割り切っているのでしょう。


[REFS[

-
[19] 
[CITE@en[[[PEP 263]] -- Defining Python Source Code Encodings | Python.org]]
([TIME[2017-02-22 15:05:56 +09:00]])
<https://www.python.org/dev/peps/pep-0263/>

]REFS]

* 関連

[SEE[ [[Emacsにおける文字コード]] ]]

[5] [CODE[vim:]] も参照。

* メモ



- [6] [CITE@en[PEP 263 -- Defining Python Source Code Encodings | Python.org]]
([TIME[2017-02-22 15:06:02 +09:00]])
<https://www.python.org/dev/peps/pep-0263/>
-- [7] 移転確認 [TIME[2025-11-03T15:35:52.800Z]]
--
[3] 
[CITE@en[PEP 263 – Defining Python Source Code Encodings | peps.python.org]], [TIME[2025-05-17T08:38:59.000Z]], [TIME[2025-05-19T08:42:59.557Z]] <https://peps.python.org/pep-0263/>



