変数 coding-system-for-read および/または coding-system-for-write
をバインドすることで、特定の操作に対するコーディングシステムを指定できます。
この変数が nil
以外の場合、ファイルの読み込みや同期サブプロセスからの入力に使用するコーディングシステムを指定します。
これは任意の非同期サブプロセスやネットワークストリームにも適用されますが、その仕組みは異なります。サブプロセスの起動時やネットワークストリームのオープン時に指定される
coding-system-for-read
の値が、そのサブプロセスやネットワークストリームの入力デコード方式を規定します。この値は、上書きされない限り、そのサブプロセスやネットワークストリームで引き続き使用されます。
この変数の正しい使い方は、特定のI/O操作に対して let
でバインドすることです。グローバル値は通常 nil
であり、これをグローバルに他の値に設定してはいけません。以下に、この変数の正しい使い方の例を示します。
;; Read the file with no character code conversion.
(let ((coding-system-for-read 'no-conversion))
(insert-file-contents filename))
その値が non-nil である場合、この変数は、file-coding-system-alist、process-coding-system-alist、network-coding-system-alist
を含む、入力に使用する符号化方式を指定する他のすべての方法よりも優先されます。
これは coding-system-for-read
とほぼ同様に動作しますが、入力ではなく出力に適用される点が異なります。ファイルへの書き込みのほか、サブプロセスやネットワーク接続への出力にも影響します。また、Emacs
がサブプロセスを呼び出す際に使用するコマンドライン引数のエンコーディングにも適用されます。
call-process-region や start-process のように、単一の演算が入力と出力の両方を担う場合、coding-system-for-read と coding-system-for-write の両方がそれに影響します。
coding-system-for-write を nil 以外の値にバインドすると、出力プリミティブが select-safe-coding-system-function
で指定された関数を呼び出せなくなります(ユーザー選択のコーディングシステム
を参照)。これは、C-x RET c (universal-coding-system-argument) が coding-system-for-write をバインドすることで動作し、Emacs
はユーザーの選択に従うべきだからです。Lisp プログラムが coding-system-for-write
を、書き出すテキストのエンコードに安全ではない可能性のある値にバインドする場合、coding-system-require-warning を nil 以外の値にバインドすることもできます。これにより、coding-system-for-write が nil
以外であっても、出力プリミティブは select-safe-coding-system-function
の値を呼び出すことでエンコードを確認せざるを得なくなります。あるいは、指定されたエンコーディングを使用する前に、明示的に select-safe-coding-system を呼び出してください。
この変数が nil
以外の場合、どのコーディングシステムが指定されていても、行末変換は行われません。これは、すべての Emacs I/O
およびサブプロセスプリミティブ、ならびに明示的なエンコーディング・デコーディング関数(明示的なエンコーディングとデコーディング を参照)に適用されます。
操作によっては、単一のコーディングシステムに固定するのではなく、複数のコーディングシステムを使い分ける必要がある場合があります。Emacsでは、コーディングシステムを使用する際の優先順位を指定できます。この順序は、find-coding-systems-region
などの関数が返すコーディングシステムのリストのソート順に影響します(Lispにおけるコーディングシステムを参照)。
この関数は、現在の優先度順にコーディングシステムの一覧を返します。オプション引数 highestp が
nil 以外の場合、最優先のコーディングシステムのみを返します。
この関数は、符号化方式の優先度リストの先頭に coding-systems を配置することで、それらの優先度を他のすべてよりも高くします。