Next: , Previous: , Up: International   [Contents][Index]


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

Emacsはテキストを読み込むとき、どのコーディングシステムが使われているか認識しようと試みます。これはファイルの読み込み、サブプロセスからの出力、X選択からのテキストなど、さまざまです。Emacsは大抵の場合 — 自分の好みを1度指定しておけば、自動的に正しいコーディングシステムを選択できます。

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

Emacsはこのようなシチュエーションを、コーディングシステムの優先リストにより処理します。Emacsがファイルを読み込むときは常に、それに使用するコーディングシステムを指定しなければ、Emacsはデータを各コーディングシステムに照らしてチェックし、それを優先順位の上から順に、データに適合するコーディングシステムが見つかるまで続けます。そして、そのコーディングシステムで、ファイル内容が表示できると仮定して変換を行います。

コーディングシステムの優先リストは、選択されている言語環境に依存します(Language Environmentsを参照してください)。たとえば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:-*-’タグをオーバーライドしません.