Next: , Previous: Coding Systems, Up: International


16.8 コーディングシステムの認識

一度自分の好みを指定しておけば、ほとんどの場合、Emacsは、 与えられたファイルに対してどのコーディングシステムを使うか認識できます。

いくつかのコーディングシステムは、 データ内にどのようなバイト列が現れたかで、認識したり区別できます。 しかし、区別できないコーディングシステムや その可能性もないコーディングシステムもあります。 たとえば、Latin-1とLatin-2を区別する方法はありません。 これらは同じバイト値を異なる意味で使用しています。

Emacsは、コーディングシステムの優先順位表を用いてこの事態を処理します。 使用するコーディングシステムを指定しなければ、 Emacsはファイルを読むときはいつでも、 優先順位のもっとも高いものから始めて順に下りながら、 データに合うコーディングシステムをみつけるまで 各コーディングシステムに対してデータを検査します。 そして、ファイルはそのコーディングシステムで表現されていると仮定して、 ファイルの内容を変換します。

コーディングシステムの優先順位表は、選択されている言語環境に依存します (see Language Environments)。 たとえば、フランス語を使うのなら、たぶん、 EmacsにはLatin-2よりLatin-1を選んでほしいでしょう。 チェコ語を使うなら、たぶん、Latin-2のほうがよいでしょう。 これが、言語環境を指定する理由の1つです。

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

iso-8859-1-dosのような行末変換を指定したコーディングシステムを使うと、 iso-8859-1を優先して認識し、その場合にはDOSの行末変換を使うことを Emacsに指示することになります。

ときには、ファイルに対して使用するコーディングシステムを ファイル名が示していることがあります。 変数file-coding-system-alistは、この対応関係を指定します。 このリストに要素を追加する特別な関数 modify-coding-system-alistがあります。 たとえば、すべての‘.txt’の読み書きに、 コーディングシステムchina-iso-8bitを使用したいなら、 つぎのLisp式を実行します。

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

始めの引数はfile、 第2引数はこれを適用するファイルを決定する正規表現、 第3引数はこれらのファイルに対して使用するコーディングシステムです。

Emacsは、ファイルの内容に基づいて、使用する行末変換の種類を認識します。 復帰のみ、あるいは、復帰改行の列のみであれば、 対応する行末変換を選択します。 変数inhibit-eol-conversionnil以外を設定すると、 行末変換の自動的な使用を禁止できます。

ファイルの先頭の‘-*-...-*-’や、 ファイルの最後のローカル変数リストを使って、 個々のファイルに対してコーディングシステムを指定できます (see File Variables)。 これを行うには、codingという名前の『変数』に値を定義します。 Emacsには、変数codingは実際にはありません。 変数を設定するかわりに、 ファイルに対して指定されたコーディングシステムを使います。 たとえば、‘-*-mode: C; coding: latin-1;-*-’は、 Cモードを指定するとともに、Latin-1のコーディングシステムの使用を指定します。 ファイルでコーディングシステムを明示的に指定した場合、 それはfile-coding-system-alistに優先します。

変数auto-coding-alistは、特定のパターンのファイル名に対して コーディングシステムを指定するもっとも強い方法です。 この変数は、ファイル自身の‘-*-coding:-*-’にさえも優先します。 Emacsはtarファイルやアーカイブファイルに対してこの機能を使います。 アーカイブ内のファイルの中にある‘-*-coding:-*-’で混乱して、 ファイル全体にコーディングシステムを適用してしまうことを防ぐのです。

Emacsがバッファに対するコーディングシステムを一度選択すると、 そのコーディングシステムをbuffer-file-coding-systemに入れておき、 このバッファからファイルに書く操作では、 デフォルトでこのコーディングシステムを使います。 これには、コマンドsave-bufferwrite-regionも含まれます。 異なるコーディングシステムを用いてこのバッファからファイルに書きたいときには、 set-buffer-file-coding-systemを使って、 そのバッファに対して異なるコーディングシステムを指定します (see Specify Coding)。

メイル(mail)モード(see Sending Mail)でメッセージを送るとき、 Emacsには、メッセージテキストの符号化に使うコーディングシステムを決定する 異なる方法が4つあります。 バッファのbuffer-file-coding-systemnil以外ならば、 その値を試します。 さもなければ、sendmail-coding-systemの値がnil以外ならば、 その値を使います。 3つめの方法は、新しいファイルに対するデフォルトの コーディングシステムがnil以外ならば、それを使います。 この値は、言語環境の選択で制御されます。 これらの3つの値がすべてnilならば、 Emacsは、Latin-1のコーディングシステムを使用して送出メイルを符号化します。

rmailで新しいメイルを受けとったとき、 各メッセージが別々のファイルであるかのように、 各メッセージは自動的にそのメイルが書かれたコーディングシステムで変換されます。 これには、指定したコーディングシステムの優先順位表を使います。 MIMEメッセージが文字集合を指定するときには、 rmail-decode-mime-charsetnilでない限り、 rmailはその指定に従います。

rmailファイル自身を読んだり保存したりするときには、 Emacsは、変数rmail-file-coding-systemで指定された コーディングシステムを使います。 そのデフォルト値は、nilです。 rmailファイルは変換しないという意味です (rmailファイルは、Emacsの内部文字コードで読み書きされる。)