Emacsはテキストを読み込むとき、どのコーディングシステムが使われているか認識しようと試みます。これはファイルの読み込み、サブプロセスからの出力、X選択からのテキストなど、さまざまです。Emacsは大抵の場合 — 自分の好みを1度指定しておけば、自動的に正しいコーディングシステムを選択できます。
データにどのバイトシーケンスが出現するかにより、認識あるいは識別されるコーディングシステムもいくつかあります。しかし識別される可能性さえないコーディングシステムもあります。たとえばLatin-1とLatin-2を識別する方法はありません。これらは同じバイト値を異なる意味で使用します。
Emacsはこのようなシチュエーションを、コーディングシステムの優先リストにより処理します。Emacsがファイルを読み込むときは常に、それに使用するコーディングシステムを指定しなければ、Emacsはデータを各コーディングシステムに照らしてチェックし、それを優先順位の上から順に、データに適合するコーディングシステムが見つかるまで続けます。そして、そのコーディングシステムで、ファイル内容が表示できると仮定して変換を行います。
コーディングシステムの優先リストは、選択されている言語環境に依存します(言語環境を参照してください)。たとえばFrenchを使うのなら、おそらくEmacsにはLatin-2よりLatin-1を選んでほしいでしょう。Czechを使うなら、おそらく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’の読み書きに、コーディングシステム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)’より、こちらのほうを好む人もいます。
デフォルトでは、コーディングシステムの自動検知はエスケープシーケンスを検出します。文字シーケンスがエスケープ文字で開始されていて、そのシーケンスが有効なISO-2022であれば、それはEmacsにファイルをデコードするエンコーディングに、ISO-2022を使うことを告げています。
しかし、ファイルの中のエスケープシーケンスを、そのまま読み取りたい場合もあるでしょう。そのような場合、変数inhibit-iso-escape-detection
を非nil
にセットします。これにより、コード検知はエスケープシーケンスを無視するようになり、ISO-2022エンコーディングは使用されません。この結果として、すべてのエスケープシーケンスがバッファー内で可視になります。
変数inhibit-iso-escape-detection
のデフォルト値はnil
です。わたしたちは特別な操作を除いて、これを変更しないことを推奨します。なぜなら、EmacsディストリビューションのEmacs
Lispソースファイルのいくつかは、コーディングシステムiso-2022-7bit
でエンコードされた非ASCII文字を含んでおり、エスケープシーケンス検知を抑止しているときにこれらのファイルをvisitすると、正しくデコードされないからです。
変数auto-coding-alist
およびauto-coding-regexp-alist
は、それぞれファイル名に含まれる特定パターン、およびファイルに含まれる特定パターンによりコーディングシステムを指定する一番強い方法です。これらの変数は、ファイル自身に含まれる‘-*-coding:-*-’タグさえオーバーライドします。たとえば、Emacsはtarおよびアーカイブファイルに、auto-coding-alist
を使います。これはアーカイブのメンバーファイルに‘-*-coding:-*-’が含まれている場合、Emacsが混乱してそれをファイル全体に適用するのを防ぎます。
コーディングシステムを指定する他の方法は、変数auto-coding-functions
を使う方法です。たとえばビルトインの1つauto-coding-functions
は、XMLファイルにたいするエンコーディングを検知します。前の2つと異なり、この変数は‘-*-coding:-*-’タグをオーバーライドしません.