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


32.10.2 エンコーディングとI/O

コーディングシステムの主な目的はファイルの読み込みと書き込みへの使用です。関数insert-file-contentsはファイルデータのデコードにコーディングシステムを使用して、write-regionはバッファーコンテンツのエンコードにコーディングシステムを使用します。

使用するコーディングシステムは明示的(Specifying Coding Systemsを参照)、またはデフォルトメカニズム(Default Coding Systemsを参照)を使用して暗黙的に指定できます。しかしこれらの手法は何を行うかを完全には指定しないかもしれません。たとえばこれらはデータから文字コード変換を行わないundefinedのようなコーディングシステムを選択するかもしれません。このような場合にはI/O処理はコーディングシステム選択によって処理を完了します。後でどのコーディングシステムが選択されたか調べたいことが頻繁にあるでしょう。

Variable: buffer-file-coding-system

このバッファーローカル変数はバッファーの保存、およびwrite-regionによるバッファー部分のファイルへの書き出しに使用されるコーディングシステムを記録する。書き込まれるテキストがこの変数で指定されたコーディングシステムを使用して安全にエンコードできない場合には、これらの操作は関数select-safe-coding-systemを呼び出すことにより代替となるエンコーディングを選択する(User-Chosen Coding Systemsを参照)。異なるエンコーディングの選択がユーザーによるコーディングシステムの指定を要するなら、buffer-file-coding-systemは新たに選択されたコーディングシステムに更新される。

buffer-file-coding-systemはサブプロセスへのテキスト送信に影響しない

Variable: save-buffer-coding-system

この変数は、(buffer-file-coding-systemをオーバーライドして)バッファーを保存するためのコーディングシステムを指定する。これはwrite-regionには使用されないことに注意。

あるコマンドがバッファーを保存するためにbuffer-file-coding-system (またはsave-buffer-coding-system)の使用を開始して、そのコーディングシステムがバッファー内の実際のテキストを処理できなければ、(select-safe-coding-systemを呼び出すことにより)そのコマンドは他のコーディングシステムの選択をユーザーに求める。これが発生した後はコマンドはユーザー指定のコーディングシステムを表すためにbuffer-file-coding-systemの更新も行う。

Variable: last-coding-system-used

ファイルやサブプロセスにたいするI/O操作は、使用したコーディングシステムの名前をこの変数にセットする。明示的にエンコードとデコードを行う関数(Explicit Encodingを参照)もこの変数をセットする。

警告: サブプロセス出力の受信によりこの変数がセットされるため、この変数はEmacsがwaitしている際は常に変更され得る。したがって興味対象となる値を格納する関数呼び出し後は、間を空けずにその値をコピーすること。

変数selection-coding-systemはウィンドウシステムにたいして選択(selection)をエンコードする方法を指定します。Window System Selectionsを参照してください。

Variable: file-name-coding-system

変数file-name-coding-systemはファイル名のエンコーディングに使用するコーディングシステムを指定する。Emacsは、すべてのファイル操作にたいして、ファイル名のエンコードにそのコーディングシステムを使用する。file-name-coding-systemnilならEmacsは選択された言語環境(language environment)により決定されたデフォルトのコーディングシステムを使用する。デフォルト言語環境ではファイル名に含まれるすべての非ASCII文字は特別にエンコードされない。これらはEmacsの内部表現を使用してファイルシステム内で表される。

警告: Emacsのセッション中にfile-name-coding-system (または言語環境)を変更した場合には、以前のコーディングシステムを使用してエンコードされた名前をもつファイルをvisitしていると、新たなコーディングシステムでは異なるように扱われるので問題が発生し得る。これらのvisitされたファイル名でこれらのバッファーの保存を試みると、保存で間違ったファイル名が使用されたりエラーとなるかもしれない。そのような問題が発生したら、そのバッファーにたいして新たなファイル名を指定するためにC-x C-wを使用すること。

Windows 2000以降ではEmacsはOSに渡すファイル名にデフォルトでUnicode APIを使用するため、file-name-coding-systemの値は大部分が無視される。Lispレベルでファイル名のエンコードやデコードを必要とするLispアプリケーションは、system-typewindows-ntのときはutf-8をコーディングシステムに使用すること。UTF-8でエンコードされたファイル名から、OSと対話するために適したエンコーディングへの変換はEmacsにより内部的に処理される。