GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Coding-System-Basics.html ・ emacs-doc.conao3.com

34.10.1 符号化方式の基本概念

文字コード変換とは、Emacs内部で使用される文字の表現と、その他のエンコーディングとの間で行われる変換のことです。Emacsは多種多様なエンコーディングに対応しており、それらへの変換およびそこからの変換が可能です。例えば、テキストをLatin 1、Latin 2、Latin 3、Latin 4、Latin 5、およびISO 2022のいくつかのバリアントといったエンコーディングに変換したり、あるいはそれらから変換したりできます。場合によっては、Emacsは同じ文字に対して複数の代替エンコーディングをサポートしています。例えば、キリル文字(ロシア語)のアルファベットには、ISO、Alternativnyj、KOI8という3つのコーディング体系が存在します。

各符号化方式は特定の文字コード変換セットを規定しているが、符号化方式 undecided は特殊である。この方式では選択を規定せず、ファイルや文字列のデコードまたはエンコード時に、そのデータに基づいて各ファイルや文字列ごとにヒューリスティックに選択を行う。符号化方式 prefer-utf-8 は undecided と同様だが、可能な場合は utf-8 を選択することを好む。

一般的に、符号化方式はラウンドトリップ同一性を保証するものではありません。符号化方式を用いてバイト列を復号し、得られたテキストを同じ符号化方式で再度符号化すると、異なるバイト列が生成されることがあります。しかし、バイト列が元々復号したものと同一になることを保証する符号化方式も存在します。以下にいくつかの例を挙げます。

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

バッファ内のテキストをエンコードし、その結果をデコードしても、元のテキストが再現されないことがあります。例えば、ある文字をサポートしていない符号化方式でその文字をエンコードした場合、結果は予測不能となり、同じ符号化方式を用いてデコードしても異なるテキストが生成される可能性があります。現在、Emacsではサポートされていない文字のエンコードに起因するエラーを報告することはできません。

改行コード変換は、ファイル内の改行を表すためにさまざまなシステムで用いられている3つの異なる規約を処理します。GNUやUnixシステム、およびmacOSで採用されているUnixの規約では、ラインフィード文字(newlineとも呼ばれる)を使用します。MS-WindowsやMS-DOSシステムで採用されているDOSの規約では、キャリッジリターンとラインフィードを使用します。Classic Mac OSで採用され、現在はレガシーソフトウェア以外では稀なMacの規約では、キャリッジリターンのみを使用します。

latin-1などの基本符号化方式では、行末変換は未指定となっており、データに応じて選択されます。latin-1-unix、latin-1-dos、latin-1-macなどの派生符号化方式では、行末変換も明示的に指定されています。ほとんどの基本符号化方式には、それぞれに対応する3つの派生方式があり、その名称は‘-unix’、‘-dos’、‘-mac’を付加して構成されます。

コーディングシステム raw-text は、文字コード変換を行わず、このコーディングシステムで参照されるバッファをユニバイトバッファにするという点が特徴的です。歴史的な経緯により、このコーディングシステムではユニバイトテキストとマルチバイトテキストの両方を保存できます。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 とは異なり、改行の変換は行われません)。このコーディングシステムは、Emacs のバッファや文字列でサポートされているすべての文字を表現できるため、キャッシュなどの内部目的でテキストを保存する際には、常にこのシステムを使用することを推奨します。

関数: 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 プロパティの値も、コーディングシステムのエイリアスとして定義されています。

関数: coding-system-aliases coding-system

この関数は、coding-system のエイリアス一覧を返します。