GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/emacs/Recognize-Coding.html ・ emacs-doc.conao3.com

24.6 コーディング体系の識別

Emacsはテキストを読み込む際、どのコーディングシステムを使用するかを判別しようとします。これは、読み込まれるファイルやサブプロセスからの出力、Xセレクションのテキストなどに適用されます。一度設定を行っておけば、ほとんどの場合、Emacsは適切なコーディングシステムを自動的に選択できます。

一部の符号化方式は、データ内にどのようなバイト列が現れるかによって識別または区別できる。しかし、潜在的にさえ区別できない符号化方式も存在する。例えば、Latin-1とLatin-2を区別する方法はなく、これらは同じバイト値を用いながら異なる意味を持っている。

Emacsは、コーディングシステムの優先順位リストを用いてこの状況に対処します。Emacsがファイルを読み込む際、使用するコーディングシステムを指定していない場合、Emacsは優先順位の先頭から順に各コーディングシステムとデータを照合し、データに適合するコーディングシステムが見つかるまで確認を続けます。その後、ファイルの内容がこのコーディングシステムで表現されているものと想定して変換を行います。

コーディングシステムの優先順位は、選択した言語環境によって異なります(言語環境を参照)。例えば、フランス語を使用する場合は、おそらくEmacsにLatin-2よりもLatin-1を優先させたいでしょうし、チェコ語を使用する場合は、おそらくLatin-2を優先させたいはずです。これが、言語環境を指定する理由の一つです。

ただし、M-x prefer-coding-system コマンドを使えば、コーディングシステムの優先順位リストを詳細に変更できます。このコマンドはミニバッファからコーディングシステムの名前を読み取り、それを優先順位リストの先頭に追加することで、他のすべてのシステムよりも優先されるようにします。このコマンドを複数回使用すると、使用するたびに優先順位リストの先頭に要素が1つずつ追加されます。

iso-8859-1-dosのように行末変換方式を指定するコーディングシステムを使用する場合、これはEmacsが優先的にiso-8859-1を認識しようとし、iso-8859-1を認識した場合にはDOSの行末変換を用いるべきであることを意味します。

ファイル名によって、そのファイルにどの符号化方式を用いるべきかが示されることがあります。変数 file-coding-system-alist はこの対応関係を指定します。このリストに要素を追加するための専用関数 modify-coding-system-alist があります。例えば、すべての ‘.txt’ ファイルを符号化方式 chinese-iso-8bit で読み書きするには、次の Lisp 式を実行します:

(modify-coding-system-alist 'file "\\.txt\\'" 'chinese-iso-8bit)

第1引数はfile、第2引数はこの指定がどのファイルに適用されるかを判定する正規表現、第3引数はこれらのファイルに使用するコーディング体系を指定します。

Emacsはファイルの内容に基づいて、どの種類の行末変換を使用するかを判断します。キャリッジリターンのみ、あるいはキャリッジリターンに続いてラインフィードが続くシーケンスのみである場合、それに応じて行末変換を選択します。変数 inhibit-eol-conversion に nil 以外の値を設定することで、行末変換の自動使用を抑制できます。そうすると、DOS形式のファイルはバッファ内で ‘^M’ 文字が表示される形で表示されます。モードラインの左端付近に表示される、より控えめな ‘(DOS)’ という行末形式の表示よりも、こちらを好む人もいます(eol-mnemonic を参照)。

デフォルトでは、符号化方式の自動検出はエスケープシーケンスに敏感に反応します。Emacsがエスケープ文字で始まる文字シーケンスを検出し、そのシーケンスがISO-2022コードとして有効である場合、EmacsはISO-2022エンコーディングのいずれかを使用してファイルをデコードします。

ただし、ファイル内のエスケープシーケンスをそのまま読み取りたい場合もあるでしょう。そのような場合は、変数 inhibit-iso-escape-detection に nil 以外の値を設定できます。すると、コード検出はエスケープシーケンスを無視し、ISO-2022 エンコーディングを一切使用しなくなります。その結果、すべてのエスケープシーケンスがバッファ内で表示されるようになります。

inhibit-iso-escape-detection のデフォルト値は nil です。恒久的に変更せず、特定の操作の際にのみ変更することを推奨します。というのも、Emacs ディストリビューションに含まれる一部の Emacs Lisp ソースファイルには、コーディングシステム iso-2022-7bit でエンコードされた非 ASCII 文字が含まれており、エスケープシーケンスの検出を抑制してこれらのファイルを開いた場合、正しくデコードされないためです。

変数 auto-coding-alist と auto-coding-regexp-alist は、それぞれ特定のファイル名パターンや、特定のパターンを含むファイルに対して、コーディングシステムを指定する最も強力な手段です。これらの変数は、ファイル自体にある ‘-*-coding:-*-’ タグさえも上書きします(ファイルのコーディングシステムの指定 を参照)。例えば、Emacs では tar やアーカイブファイルに auto-coding-alist を使用しています。これは、アーカイブ内の構成要素にある ‘-*-coding:-*-’ タグによって混乱し、それがアーカイブファイル全体に適用されると判断してしまうのを防ぐためです。

コーディングシステムを指定するもう一つの方法は、変数 auto-coding-functions を使用することです。例えば、組み込みの auto-coding-functions の一つは XML ファイルのエンコーディングを検出します。前述の2つとは異なり、この変数はいかなる ‘-*-coding:-*-’ タグも上書きしません。