Next: Terminal I/O Encoding, Previous: Specifying Coding Systems, Up: Coding Systems [Contents][Index]
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-write
をno-conversion
にバインドすることによりエンコードを抑制する等、それをファイルまたはプロセスへコピーするのが通常の使い方です。
以下はエンコードやデコードを明示的に行う関数です。エンコード関数とはバイトシーケンスを生成し、デコード関数とはバイトシーケンスを操作する関数のことを意味します。これらの関数はすべてテキストプロパティを破棄します。これらは自身が使用したコーディングシステムを、正確にlast-coding-system-used
にセットすることも行います。
このコマンドはstartからendのテキストをコーディングシステムcoding-systemでエンコードする。バッファー内の元テキストは通常はエンコードされたテキストで置き換えられるが、オプション引数destinationでそれを変更できる。destinationがバッファーなら、エンコードされたテキストはそのバッファーのポイントの後に挿入される(ポイントは移動しない)。t
ならこのコマンドはエンコードされたテキストを挿入せずにユニバイトとしてリターンする。
エンコードされたテキストが何らかのバッファーに挿入された場合には、このコマンドはエンコードされたテキストの長さをリターンする。
エンコードされた結果は理論的にはバイトシーケンスだが、バッファーが以前マルチバイトだったならマルチバイトのまま留まり、すべての8ビットのバイトはマルチバイト表現に変換される(Text Representationsを参照)。
期待しない結果となる恐れがあるので、テキストをエンコードする際にはcoding-systemにundecided
を使用してはならない。coding-systemにたいして自明な適値が存在しなければ適切なエンコードを提案させるために、かわりにselect-safe-coding-system
を使用すること(select-safe-coding-systemを参照)。
この関数はコーディングシステムcoding-systemでstring内のテキストをエンコードする。これはエンコードされたテキストを含む新たな文字列をリターンするが、nocopyが非nil
の場合には、それが些細なエンコード処理ならこの関数はstring自身をリターンする。エンコード結果はユニバイト文字列。
このコマンドはコーディングシステムcoding-systemで、startからendのテキストをデコードする。明示的なデコードを使いやすくするためにデコード前のテキストはバイトシーケンス値であるべきだが、マルチバイトとユニバイトのバッファーいずれでも許すようになっている(マルチバイトバッファーの場合rawバイト値は8ビット文字で表現されていること)。デコードされたテキストにより通常はバッファー内の元のテキストは置き換えられるが、オプション引数destinationはそれを変更する。destinationがバッファーなら、デコードされたテキストはそのバッファーのポイントの後に挿入される(ポイントは移動しない)。これがt
ならこのコマンドはデコードされたテキストを挿入せずにマルチバイト文字列としてリターンする。
デコードしたテキストを何らかのバッファーに挿入すると、このコマンドはデコード済みテキストの長さをリターンする。バッファーがユニバイトバッファー(Selecting a Representationを参照)なら、デコード済みテキストの内部表現(Text Representationsを参照)が個別のバイトとしてバッファーに挿入される。
このコマンドはデコードされたテキストにテキストプロパティcharset
をputする。このプロパティの値は元のテキストのデコードに使用された文字セットを示す。
このコマンドは必要ならテキストのエンコーディングを検出する。coding-systemがundecided
ならコマンドはテキスト内に見出されたバイトシーケンスにもとづいてテキストのエンコーディングを検出するとともに、そのテキストが使用している行末変換のタイプ(eol
typeを参照)も検出する。coding-systemがundecided-eol-type
(eol-typeはunix
、dos
、mac
のいずれか)なら、コマンドが検出するのはテキストのエンコーディングのみ。utf-8
のようにeol-typeを指定しないすべてのcoding-systemにたいして、このコマンドは行末変換を検出する。そのテキストが使用している行末変換が事前に判っている場合には、余計な自動検出を防ぐために、utf-8-unix
のようにエンコーディングを完全に指定すること。
この関数はcoding-systemでstring内のテキストをデコードする。これはデコードされたテキストを含む新たな文字列をリターンするが、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))
この関数はfromからtoのテキストを、あたかも与えられた残りの引数でinsert-file-contents
を使用してファイルfilenameから読み込んだかのようにデコードする。
デコードせずにファイルからテキストを読み込んだ後で、やはりデコードすることを決心したときに使用するのがこの関数の通常の使い方である。テキストを削除して再度読み込むかわりに、この関数を呼び出せばデコードして読み込むことができる。