Next: , Previous: , Up: Coding Systems   [Contents][Index]


34.10.7 明示的なエンコードとデコード

Emacs内外へテキストを転送するすべての操作は、そのテキストをエンコードまたはデコードする能力をもっています。このセクション内の関数を使用してテキストの明示的なエンコードやデコードを行うことができます。

エンコード結果やデコーディングへの入力は通常のテキストではありません。これらは理論的には一連のバイト値から構成されており、すなわち一連のASCII文字と8ビット文字から構成されます。ユニバイトのバッファーや文字列では、これらの文字は0から#xFF(255)の範囲のコードをもちます。マルチバイトのバッファーや文字列では8ビット文字は#xFFより大きい文字コードをもちますが(Text Representationsを参照)、そのようなテキストのエンコードやデコードの際にEmacsは透過的にそれらを単一バイト値に変換します。

コンテンツを明示的にデコードできるようにバイトシーケンスとしてバッファーにファイルを読み込むには、insert-file-contents-literally (Reading from Filesを参照)を使用するのが通常の方法です。あるいはfind-file-noselectでファイルをvisitする際には、引数rawfileに非nilを指定することもできます。これらのメソッドの結果はユニバイトバッファーになります。

テキストを明示的にエンコードした結果であるバイトシーケンスは、たとえばそれをwrite-region (Writing to Filesを参照)で書き込み、coding-system-for-writeno-conversionにバインドすることによりエンコードを抑制する等、それをファイルまたはプロセスへコピーするのが通常の使い方です。

以下はエンコードやデコードを明示的に行う関数です。エンコード関数とはバイトシーケンスを生成し、デコード関数とはバイトシーケンスを操作する関数のことを意味します。これらの関数はすべてテキストプロパティを破棄します。これらは自身が使用したコーディングシステムを、正確にlast-coding-system-usedにセットすることも行います。

Command: encode-coding-region start end coding-system &optional destination

このコマンドはstartからendのテキストをコーディングシステムcoding-systemでエンコードする。バッファー内の元テキストは通常はエンコードされたテキストで置き換えられるが、オプション引数destinationでそれを変更できる。destinationがバッファーなら、エンコードされたテキストはそのバッファーのポイントの後に挿入される(ポイントは移動しない)。tならこのコマンドはエンコードされたテキストを挿入せずにユニバイトとしてリターンする。

エンコードされたテキストが何らかのバッファーに挿入された場合には、このコマンドはエンコードされたテキストの長さをリターンする。

エンコードされた結果は理論的にはバイトシーケンスだが、バッファーが以前マルチバイトだったならマルチバイトのまま留まり、すべての8ビットのバイトはマルチバイト表現に変換される(Text Representationsを参照)。

期待しない結果となる恐れがあるので、テキストをエンコードする際にはcoding-systemundecided使用してはならないcoding-systemにたいして自明な適値が存在しなければ適切なエンコードを提案させるために、かわりにselect-safe-coding-systemを使用すること(select-safe-coding-systemを参照)。

Function: encode-coding-string string coding-system &optional nocopy buffer

この関数はコーディングシステムcoding-systemstring内のテキストをエンコードする。これはエンコードされたテキストを含む新たな文字列をリターンするが、nocopyが非nilの場合には、それが些細なエンコード処理ならこの関数はstring自身をリターンする。エンコード結果はユニバイト文字列。

Command: decode-coding-region start end coding-system &optional destination

このコマンドはコーディングシステムcoding-systemで、startからendのテキストをデコードする。明示的なデコードを使いやすくするためにデコード前のテキストはバイトシーケンス値であるべきだが、マルチバイトとユニバイトのバッファーいずれでも許すようになっている(マルチバイトバッファーの場合rawバイト値は8ビット文字で表現されていること)。デコードされたテキストにより通常はバッファー内の元のテキストは置き換えられるが、オプション引数destinationはそれを変更する。destinationがバッファーなら、デコードされたテキストはそのバッファーのポイントの後に挿入される(ポイントは移動しない)。これがtならこのコマンドはデコードされたテキストを挿入せずにマルチバイト文字列としてリターンする。

デコードしたテキストを何らかのバッファーに挿入すると、このコマンドはデコード済みテキストの長さをリターンする。バッファーがユニバイトバッファー(Selecting a Representationを参照)なら、デコード済みテキストの内部表現(Text Representationsを参照)が個別のバイトとしてバッファーに挿入される。

このコマンドはデコードされたテキストにテキストプロパティcharsetをputする。このプロパティの値は元のテキストのデコードに使用された文字セットを示す。

このコマンドは必要ならテキストのエンコーディングを検出する。coding-systemundecidedならコマンドはテキスト内に見出されたバイトシーケンスにもとづいてテキストのエンコーディングを検出するとともに、そのテキストが使用している行末変換のタイプ(eol typeを参照)も検出する。coding-systemundecided-eol-type (eol-typeunixdosmacのいずれか)なら、コマンドが検出するのはテキストのエンコーディングのみ。utf-8のようにeol-typeを指定しないすべてのcoding-systemにたいして、このコマンドは行末変換を検出する。そのテキストが使用している行末変換が事前に判っている場合には、余計な自動検出を防ぐために、utf-8-unixのようにエンコーディングを完全に指定すること。

Function: decode-coding-string string coding-system &optional nocopy buffer

この関数はcoding-systemstring内のテキストをデコードする。これはデコードされたテキストを含む新たな文字列をリターンするが、nocopyが非nilの場合には、それが些細なデコード処理ならstring自体をリターンするかもしれない。明示的なデコードを使いやすくするために、stringのコンテンツはバイトシーケンス値をもつユニバイト文字列であるべきだが、マルチバイト文字列も許すようになっている(マルチバイト形式で8ビットバイトを含むと仮定する)。

この関数は必要ならdecode-coding-regionが行うようにエンコーディングを検出する。

オプション引数bufferがバッファーを指定する場合には、デコードされたテキストはバッファー内のポイントの後に挿入される(ポイントは移動しない)。この場合にはリターン値はデコードされたテキストの長さとなる。バッファーがユニバイトバッファーなら、デコード済みテキストの内部表現が個別のバイトとしてバッファーに挿入される。

この関数はデコードされたテキストにテキストプロパティcharsetをputする。このプロパティの値は元のテキストのデコードに使用された文字セットを示す。

(decode-coding-string "Gr\374ss Gott" 'latin-1)
     ⇒ #("Grüss Gott" 0 9 (charset iso-8859-1))
Function: decode-coding-inserted-region from to filename &optional visit beg end replace

この関数はfromからtoのテキストを、あたかも与えられた残りの引数でinsert-file-contentsを使用してファイルfilenameから読み込んだかのようにデコードする。

デコードせずにファイルからテキストを読み込んだ後で、やはりデコードすることを決心したときに使用するのがこの関数の通常の使い方である。テキストを削除して再度読み込むかわりに、この関数を呼び出せばデコードして読み込むことができる。