Next: , Up: コーディングシステム   [Contents][Index]


34.10.1 コーディングシステムの基本概念

文字コード変換(character code conversion)により、Emacs内部で使用される文字の内部表現と他のエンコーディングの間で変換が行われます。Emacsは多くの異なるエンコーディングをサポートしており、それらは双方向に変換が可能です。たとえばLatin 1、Latin 2、Latin 3、Latin 4、Latin 5、およびいくつかのISO 2022の変種等のようなエンコーディングにたいしてテキストを双方向に変換できます。あるケースにおいては同じ文字にたいしてEmacsは複数のエンコーディング候補をサポートします。たとえばキリル(ロシア語)のアルファベットにたいしてはISO、Alternativnyj、KOI8のように3つにコーディングシステムが存在します。

コーディングシステムはそれぞれ特定の文字コード変換セットを指定しますが、undecidedというコーディングシステムは特別です。これはファイル(や文字列)にたいしてデコードやエンコードを行う際に、そのファイル(や文字列)のデータにもとづいて発見的に選択が行われるように、選択を未指定のままにします。コーディングシステムprefer-utf-8undecidedと似ていますが、可能ならutf-8を優先的に選択します。

一般的にコーディングシステムは可逆的な同一性を保証しません。あるコーディングシステムを使用してバイトシーケンスをデコードしてから、同じコーディングシステムで結果テキストをエンコードしても、異なるバイトシーケンスが生成される可能性があります。しかしデコードされたオリジナルのバイトシーケンスとなることを保証するコーディングシステムもいくつかあります。以下にいくつかの例を挙げます:

iso-8859-1、utf-8、big5、shift_jis、euc-jp

バッファーテキストのエンコードと結果のデコードでもオリジナルテキストの再生成に失敗する可能性があります。たとえばその文字をサポートしないコーディングシステムで文字をエンコードした場合の結果は予測できず、したがって同じコーディングシステムを使用してそれをデコードしても異なるテキストが生成されるでしょう。現在のところEmacsは未サポート文字のエンコーディングによる結果をエラーとして報告できません。

行末変換(end of line conversion: 改行変換)はファイル内の行末を表すために、さまざまなシステム上で使用される3つの異なる慣例を扱います。GNUやUnixシステムで使用されるUnixの慣例ではLF文字(linefeed文字、改行とも呼ばれる)が使用されます。MS-WindowsやMS-DOSシステムで使用されるDOSの慣例では行末にCR文字(carriage-return文字、復帰文字とも呼ばれる)とLF文字が使用されます。Macの慣例ではCR文字だけが使用されます(これはクラシックなMac OSで使用されていた慣例)。

latin-1のようなベースコーディングシステム(base coding systems: 基本コーディングシステム)では、データにもとづいて選択されるように行末変換は未指定となっています。latin-1-unixlatin-1-doslatin-1-macのようなバリアントコーディングシステム(variant coding systems: 変種コーディングシステム)では行末変換を明示的に指定します。ほとんどのベースコーディングシステムは‘-unix’、‘-dos’、‘-mac’を追加した3つの対応する形式の変種をもちます。

raw-textは文字コード変換を抑制して、このコーディングシステムでvisitされたバッファーがユニバイトバッファーとなる点において特殊なコーディングシステムです。歴史的な理由によりこのコーディングシステムによりユニバイトとマルチバイト両方のテキストを保存できます。マルチバイトテキストのエンコードにraw-textを使用した際には1文字コード変換を行います。8ビット文字は1バイトの外部表現に変換されます。raw-textは通常のようにデータにより判断できるように行末変換を指定せず、通常のように行末変換を指定する3つの変種をもちます。

no-conversion (とエイリアスのbinary)はraw-text-unixと等価です。これは文字コードおよび行末にたいする変換をいずれも指定しません。

utf-8-emacsはデータがEmacsの内部エンコーディング(テキストの表現方法を参照)で表されることを指定するコーディングシステムです。コード変換が何も発生しない点でraw-textと似ていますが、結果がマルチバイトデータである点が異なります。 emacs-internalという名前はutf-8-emacs-unixにたいするエイリアスです(そのため3種類すべての行末変換をデコードするutf-8-emacsと異なり行末変換を強制しない)。

Function: coding-system-get coding-system property

この関数はコーディングシステムcoding-systemの指定されたプロパティをリターンする。コーディングシステムのプロパティのほとんどは内部的な目的のために存在するが、:mime-charsetについては有用と思うかもしれない。このプロパティの値はそのコーディングシステムが読み書きできる文字コードにたいしてMIME内で使用される名前。以下は例:

(coding-system-get 'iso-latin-1 :mime-charset)
     ⇒ iso-8859-1
(coding-system-get 'iso-2022-cn :mime-charset)
     ⇒ iso-2022-cn
(coding-system-get 'cyrillic-koi8 :mime-charset)
     ⇒ koi8-r

:mime-charsetプロパティの値はそのコーディングシステムにたいするエイリアスとしても定義されている。

Function: coding-system-aliases coding-system

この関数はcoding-systemのエイリアスのリストをリターンする。