Emacsへのテキストの入出力を行うすべての操作では、コーディングシステムを用いてテキストをエンコードまたはデコードすることが可能です。また、本節の関数を使用して、明示的にテキストをエンコードおよびデコードすることもできます。
エンコードの結果およびデコードへの入力は、通常のテキストではありません。これらは論理的に一連のバイト値、すなわち一連のASCII文字および8ビット文字で構成されています。ユニバイトバッファや文字列において、これらの文字のコードは0から#xFF (255)の範囲にあります。マルチバイトバッファや文字列では、8ビット文字の文字コードは#xFFを超えますが(テキスト表現を参照)、このようなテキストをエンコードまたはデコードする際、Emacsはそれらを透過的に単一バイト値に変換します。
ファイルをバイト列としてバッファに読み込み、その内容を明示的にデコードする一般的な方法は、insert-file-contents-literally を使用することです(ファイルからの読み込みを参照)。あるいは、find-file-noselect でファイルにアクセスする際に、nil や rawfile
以外の引数を指定することもできます。これらの方法では、ユニバイトバッファが生成されます。
テキストを明示的にエンコードして得られるバイト列の一般的な利用方法は、それをファイルやプロセスにコピーすることです。例えば、write-region で書き込んだり(ファイルへの書き込みを参照)、coding-system-for-write を no-conversion にバインドしてエンコードを抑制したりする方法があります。
明示的なエンコードまたはデコードを行うための関数を以下に示します。エンコード関数はバイト列を生成し、デコード関数はバイト列を処理することを目的としています。これらの関数はすべて、テキストプロパティを破棄します。また、last-coding-system-used に使用した正確なコーディングシステムを設定します。
このコマンドは、start から end
までのテキストを、符号化方式 coding-system
に従って符号化します。通常、符号化されたテキストはバッファ内の元のテキストを置き換えますが、オプション引数 destination によってこれを変更できます。destination
がバッファである場合、符号化されたテキストはポイントの後にそのバッファに挿入されます(ポイントは移動しません)。t である場合、コマンドは符号化されたテキストを挿入せず、ユニバイト文字列として返します。
何らかのバッファにエンコード済みテキストが挿入されている場合、このコマンドはエンコード済みテキストの長さを返します。
エンコードの結果は論理的にはバイト列となりますが、バッファが元々マルチバイトであった場合はそのままマルチバイトとなり、任意の8ビットバイトはマルチバイト表現に変換されます(テキスト表現を参照)。
テキストをエンコードする際、予期しない結果を招く可能性があるため、coding-system に
undecided を使用しないでください。代わりに、coding-system
に明らかな該当値がない場合は、適切なエンコーディングを提案するために select-safe-coding-system(select-safe-coding-system
を参照)を使用してください。
この関数は、コーディングシステム coding-system に従ってテキストを string でエンコードします。エンコードされたテキストを含む新しい文字列を返しますが、nocopy が nil
以外の場合は、エンコード処理が自明であれば string
自体を返すことがあります。エンコードの結果はユニバイト文字列となります。
このコマンドは、コーディングシステム coding-system に従って、start から end
までのテキストをデコードします。明示的なデコードを有用にするには、デコード前のテキストがバイト値のシーケンスである必要がありますが、マルチバイトバッファとユニバイトバッファのどちらも使用可能です(マルチバイトの場合、生のバイト値は8ビット文字として表現される必要があります)。通常、デコードされたテキストがバッファ内の元のテキストを置き換えますが、オプション引数
destination によってこれを変更できます。destination
がバッファである場合、デコードされたテキストはポイントの後にそのバッファに挿入されます(ポイントは移動しません)。t の場合は、コマンドはデコードされたテキストを挿入せずにマルチバイト文字列として返します。
デコード済みテキストが何らかのバッファに挿入されている場合、このコマンドはデコード済みテキストの長さを返します。そのバッファがユニバイトバッファ(表現の選択を参照)である場合、デコード済みテキストの内部表現(テキスト表現を参照)が、個々のバイトとしてバッファに挿入されます。
このコマンドは、デコード済みテキストに charset
テキストプロパティを付与します。このプロパティの値には、元のテキストのデコードに使用された文字セットが指定されます。
このコマンドは、必要に応じてテキストのエンコーディングを検出します。coding-system が
undecided
の場合、コマンドはテキスト内で見つかったバイト列に基づいてエンコーディングを検出し、さらにテキストで使用されている改行規約の種類も検出します(eol type を参照)。coding-system が undecided-eol-type で、eol-type が unix、dos、または mac の場合、コマンドはテキストのエンコーディングのみを検出します。utf-8 のように、eol-type を指定していない coding-system がある場合、コマンドは改行規約を検出します。テキストで使用されている EOL
規約があらかじめ分かっている場合は、自動検出を防ぐため、utf-8-unix
のようにエンコーディングを完全に指定してください。
この関数は、string 内のテキストを coding-system に従ってデコードします。デコードされたテキストを含む新しい文字列を返しますが、nocopy が nil
以外の場合は、デコード処理が自明であれば string
自体を返すことがあります。明示的なデコードを有用にするため、string
の内容はバイト値のシーケンスからなるユニバイト文字列であるべきですが、マルチバイト文字列も許容されます(マルチバイト形式の8ビットバイトが含まれていることが前提です)。
この関数は、decode-coding-region
と同様に、必要に応じて文字列のエンコーディングを検出します。
オプション引数 buffer でバッファを指定した場合、デコードされたテキストは point の後のそのバッファに挿入されます(point は移動しません)。このとき、戻り値はデコードされたテキストの長さとなります。そのバッファがユニバイトバッファである場合、デコードされたテキストの内部表現が個々のバイトとしてそこに挿入されます。
この関数は、デコード済みテキストに charset
テキストプロパティを付与します。このプロパティの値は、元のテキストのデコードに使用された文字セットを示します:
(decode-coding-string "Gr\374ss Gott" 'latin-1)
⇒ #("Grüss Gott" 0 10 (charset iso-8859-1))
この関数は、指定された残りの引数を用いて、from から to までのテキストを、あたかもファイル filename から
insert-file-contents を用いて読み込んでいるかのようにデコードします。
この関数の一般的な使い方は、ファイルからデコードせずにテキストを読み込んだ後、やはりデコードして読み直したいと思った場合です。テキストを削除して再度読み込むのではなく、今度はデコードして読み込むために、この関数を呼び出すことができます。