[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32. 非ASCII文字

本章では, 非ASCIIに関連する特別なことがらと それらが文字列やバッファにどのように保存されるかについて述べます.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.1 テキスト表現

Emacsには2つのテキスト表現, つまり, 文字列やバッファでテキストを表す方法が2つあります. これらは, ユニバイト(unibyte)と マルチバイト(multibyte)と呼ばれます. 各文字列や各バッファでは, これらの2つの表現の一方を使います. ほとんどの目的には, Emacsがこれらのあいだで適切に変換するので, 読者はこれらの表現に関しては無視できます. Lispプログラムでは, これらの違いに注意する必要がしばしばあります.

ユニバイト表現では, 各文字は1バイトを占め, そのため, 可能な文字コードの範囲は0から255です. コード0から127はASCII文字です. コード128から255は非ASCII文字集合の1つ (変数nonascii-insert-offsetに設定して文字集合を選べる) に使われます.

マルチバイト表現では, 1文字は1バイト以上を占め, そのため, Emacsの文字コードの範囲全体を格納できるのです. マルチバイト文字の最初のバイトはつねに128から159(8進数で0200から0237)の 範囲にあります. これらの値をリーディングコード(leading code)と呼びます. マルチバイト文字の2バイト以降はつねに160から255(8進数で0240から0377)の 範囲にあります. これらの値をトレイリングコード(trailing code)と呼びます.

バッファでは, 変数enable-multibyte-charactersの バッファローカルな値が使用する表現を指定します. 文字列の表現は, 文字列を作成するときの文字列の内容に基づいて決定されます.

Variable: enable-multibyte-characters

この変数は, バッファのテキスト表現を指定する. これがnil以外であると, バッファはマルチバイトテキストを保持する. さもなければユニバイトテキストを保持する.

この変数に直接設定することはできない. そのかわりに, バッファの表現を変更するには, 関数set-buffer-multibyteを使う.

Variable: default-enable-multibyte-characters

この変数の値は, (default-value 'enable-multibyte-characters)に完全に等価であり, この変数に設定するとデフォルト値を変更する. バッファのenable-multibyte-charactersのローカルな束縛に設定することは 許されていないが, デフォルト値を変更することは可能であり, そうしても既存のバッファには影響しないので理にかなっている.

コマンド行オプション‘--unibyte’は, 起動時の早い段階でデフォルト値にnilを設定することで役目を果たす.

Function: multibyte-string-p string

文字列stringにマルチバイト文字が含まれるとtを返す.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.2 テキスト表現の変換

Emacsはユニバイトテキストをマルチバイトに変換できます. マルチバイトテキストをユニバイトにも変換できますが, この変換では情報が欠落します. バッファにテキストを挿入するとき, あるいは, 複数の文字列から1つの文字列にテキストを収めるときに, 一般にこれらの変換が行われます. 文字列の内容をどちらかの表現に明示的にも変換できます.

Emacsは, 文字列を作成するときにはその内容に基づいて 文字列の表現を選びます. 一般則は, ユニバイトテキストを他のマルチバイトテキストに組み入れるときには ユニバイトテキストをマルチバイトテキストに変換します. マルチバイト表現のほうが汎用であり, ユニバイトテキストのどんな文字でも保持できるからです.

バッファにテキストを挿入するときには, Emacsは, 当該バッファのenable-multibyte-charactersの指定に従った バッファの表現にテキストを変換します. 特に, ユニバイトバッファにマルチバイトテキストを挿入するときには, マルチバイトテキスト内のすべての文字を一般には保存できなくても, Emacsはテキストをユニバイトに変換します. 自然な代替案はバッファ内容をマルチバイトに変換することですが, これは受け入れられません. バッファの表現はユーザーが選択したものであり自動的には無視できないからです.

ユニバイトテキストをマルチバイトテキストに変換しても ASCII文字は無変更であり, 128から159も同様です. 160から255の非ASCIIについては, 各文字にnonascii-insert-offsetの値を加算することで変換します. この変数に設定すると, ユニバイト文字がどの文字集合に対応するかを指定できます (see section 文字集合). たとえば, nonascii-insert-offset(- (make-char 'latin-iso8859-1) 128)の2048であると, 非ASCIIのユニバイトはLatin 1に対応します. (- (make-char 'greek-iso8859-7) 128)の2688であると, ギリシャ文字に対応します.

マルチバイトテキストをユニバイトに変換するのは簡単で, 各文字コードと255の論理積をとります. nonascii-insert-offsetに 文字集合の始まりに対応する合理的な値が設定されていれば, この変換は逆変換になります. つまり, ユニバイトテキストをマルチバイトに変換し, それをユニバイトに戻すともとのユニバイトテキストになります.

Variable: nonascii-insert-offset

この変数は, ユニバイトテキストをマルチバイトに変換するときに 非ASCII文字に加算する値を指定する. これは, 128から255のユニバイトの非ASCIIの範囲の文字を挿入する self-insert-commandにも適用される. しかし, 関数insert-charはこの変換を行わない.

文字集合csを選択する正しい値は, (- (make-char cs) 128)である. nonascii-insert-offsetの値が0であると, 実際の変換には0ではなくLatin 1文字集合に対する値を使う.

Variable: nonascii-translation-table

この変数は, nonascii-insert-offsetのより一般的な代替を提供する. 128から255の範囲の各コードをマルチバイト文字に変換する方法を 独立して指定するために使える. その値はベクトルかnilであること. これがnil以外であると, nonascii-insert-offsetに優先する.

Function: string-make-unibyte string

この関数は, stringのテキストがすでにユニバイトでなければ ユニバイト表現に変換してから結果を返す. stringがユニバイトであれば無変更で返す.

Function: string-make-multibyte string

この関数は, stringのテキストがすでにマルチバイトでなければ マルチバイト表現に変換してから結果を返す. stringがマルチバイトであれば無変更で返す.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.3 表現の選択

既存のバッファや文字列がユニバイトであるときに マルチバイトとして調べたり, その逆のように調べるのが 有用なこともあります

Function: set-buffer-multibyte multibyte

カレントバッファの表現方法を設定する. multibytenil以外であると, バッファはマルチバイトになる. multibytenilであると, バッファはユニバイトになる.

この関数は, バイト列としてみたバッファ内容を変更しない. その結果, 文字として見たときの内容を変更できる. マルチバイト表現では1文字とみなされる2バイトの列は, ユニバイト表現では2文字になる.

この関数は, enable-multibyte-charactersに どちらの表現を使用しているかを記録する. さらに(オーバレイ, テキスト属性, マーカなどの)バッファ内のさまざまな データを調整して, それ以前と同様に同じテキストに及ぶようにする.

Function: string-as-unibyte string

この関数は, 各バイトを1文字とみなして stringと同じバイトの文字列を返す. つまり, 値にはstringより多くの文字が含まれることがある.

stringがすでにユニバイトであると, 値はstringそのものである.

Function: string-as-multibyte string

この関数は, マルチバイトの各列を1文字とみなして stringと同じバイトの文字列を返す. つまり, 値にはstringより少ない文字が含まれることがある.

stringがすでにマルチバイトであると, 値はstringそのものである.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.4 文字コード

ユニバイトとマルチバイトのテキスト表現では, 異なる文字コードを使っています. ユニバイト表現において正しい文字コードは0から255の範囲であり, これらの値は1バイトに収まります. マルチバイト表現において正しい文字コードは0から524287の範囲ですが, この範囲のすべての値が正しいとは限りません. 特に, 値128から255は (『生のバイト』にはありうる. see section 明示的な符号化と復号化), マルチバイトテキストでは正しくありません. 0から127のASCIIコードのみが, どちらの表現でも完全に正しいのです.

Function: char-valid-p charcode

この関数は, charcodeが2つのテキスト表現のどちらか一方で 正しければtを返す.

 
(char-valid-p 65)
     ⇒ t
(char-valid-p 256)
     ⇒ nil
(char-valid-p 2248)
     ⇒ t

[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.5 文字集合

Emacsは文字をさまざまな文字集合(character set)に分類します. 文字集合にはシンボルである名前があります. 各文字はたった1つの文字集合に属します.

一般に, 異なる文字体系ごとに1つの文字集合があります. たとえば, latin-iso8859-1は1つの文字集合であり, greek-iso8859-7は別の文字集合であり, asciiも別の文字集合です. Emacsの1つの文字集合には最大9025個の文字を保持できます. したがって, 論理的には1つの文字集合にまとめられる文字群を, 複数の文字集合に分割する場合もあります. たとえば, Big 5として一般には知られている中国文字の1つの集合は, Emacsの2つの文字集合, chinese-big5-1chinese-big5-2に 分割されます.

Function: charsetp object

objectが文字集合の名前のシンボルであればtを返す. さもなければnilを返す.

Function: charset-list

この関数は, 定義されているすべての文字集合の名前のリストを返す.

Function: char-charset character

この関数は文字characterが属する文字集合の名前を返す.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.6 文字とバイト

マルチバイト表現では, 各文字は1バイトかそれ以上のバイトを占めます. 各文字集合には, 通常は1バイト長か2バイト長の 導入列(introduction sequence)があります (例外:ASCIIの導入列は0バイト長である). 導入列は, 文字集合の任意の文字のバイト列の始まりです. 文字のバイト列の残りの部分は, 同じ文字集合内で他の文字とその文字を区別します. 文字集合に依存して, 区別するためのバイトは1バイトか2バイトです. そのようなバイト数を文字集合の次元(dimension)と呼びます.

Function: charset-dimension charset

この関数は, 文字集合charsetの次元を返す. 現在, 次元はつねに1か2である.

文字集合の導入列のバイト長を判定するもっとも簡単な方法はつぎのとおりです.

 
(- (char-bytes (make-char charset))
   (charset-dimension charset))

[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.7 文字の分割

本節の関数は, 文字とそれを表現するために用いられるバイト値のあいだの 変換を行います. ほとんどの目的に関しては, Emacsが必要に応じて自動的に行うため, 文字を表現するためのバイト列を扱う必要はありません.

Function: char-bytes character

この関数は, 文字characterを表現するために必要なバイト数を返す. これは, 文字characterが属する文字集合だけに依存し, その文字集合(see section 文字集合)の次元とその導入列の和に等しい.

 
(char-bytes 2248)
     ⇒ 2
(char-bytes 65)
     ⇒ 1
(char-bytes 192)
     ⇒ 1

マルチバイト表現とユニバイト表現のどちらに対しても この関数で正しい結果を得られるのは, 2つの表現で用いられる非ASCII文字コードに重なりがないからである.

Function: split-char character

文字characterの文字集合の名前に続けて, その文字集合でcharacterを識別する1バイトか2バイトの値(整数)から 成るリストを返す. バイト値の個数はその文字集合の次元である.

 
(split-char 2248)
     ⇒ (latin-iso8859-1 72)
(split-char 65)
     ⇒ (ascii 65)

ユニバイトの非ASCII文字は, 文字集合asciiの一部とみなす.

 
(split-char 192)
     ⇒ (ascii 192)
Function: make-char charset &rest byte-values

この関数は, 文字集合charsetにおいて byte-valuesで識別される文字を返す. これは, split-charのほぼ逆関数にあたる. 通常, 文字集合charsetの次元に応じて, 1つか2つのbyte-valuesを指定する. たとえばつぎのとおり.

 
(make-char 'latin-iso8859-1 72)
     ⇒ 2248

byte-valuesを指定せずにmake-charを呼び出すと, その結果は文字集合charsetを代表する 汎用文字(generic character)である. 汎用文字は整数であるが, 文字としてバッファに挿入するには 正しくないものである. 1つの文字集合全体を表すためにchar-table-rangeで使える (see section 文字テーブル). char-valid-pは汎用文字に対してはnilを返す. たとえばつぎのとおり.

 
(make-char 'latin-iso8859-1)
     ⇒ 2176
(char-valid-p 2176)
     ⇒ nil
(split-char 2176)
     ⇒ (latin-iso8859-1 0)

[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.8 文字集合の走査

バッファや文字列の一部分にどの文字集合が現れるかを 調べられると有用なことがあります. その1つの用途は, 当該テキストすべてを表現する能力がある コーディングシステム(see section コーディングシステム)を探すことです.

Function: find-charset-region beg end &optional translation

この関数は, カレントバッファのbegendのあいだに 現れる文字集合のリストを返す.

省略可能な引数translationは, テキストを走査するときに使用する変換表を指定する (see section 文字の変換). これがnil以外であると, 領域内の各文字をこの表を介して変換し, 戻り値は, バッファ内の実際の文字のかわりに変換した文字に関する情報を与える.

Function: find-charset-string string &optional translation

この関数は, 文字列stringに現れる文字集合のリストを返す.

省略可能な引数translationは変換表を指定する. 上記のfind-charset-regionを参照.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.9 文字の変換

変換表(translation table)は, 文字群を文字群へ対応付けます. これらの表は, 符号化と復号化, 他の目的に使われます. 独自の変換表を指定するコーディングシステムもあります. 他のすべてのコーディングシステムに適用される デフォルトの変換表もあります.

Function: make-translation-table translations

この関数は, 引数translationsに基づいた変換表を返す. 引数translationsの各要素は, (from . to)の形であり, 文字fromtoへ変換することを意味する.

1つの文字集合全体を同じ次元の別の文字集合へ対応付けることも可能である. それには, fromに(文字集合を表す)汎用文字を指定する (see section 文字の分割). この場合, toも, 同じ次元の別の文字集合の汎用文字であること. こうすると, この変換表は, fromの文字集合の各文字を toの文字集合の対応する文字へ変換する.

復号化では, もとの復号化結果の文字に変換表による変換を適用します. コーディングシステムに属性character-translation-table-for-decodeが あれば, これは使用する変換表を指定します. さもなければ, standard-character-translation-table-for-decodenil以外であれば, 復号化ではその表を使います.

符号化では, バッファ内の文字に変換表による変換を適用し, 変換結果を実際に符号化します. コーディングシステムに属性character-translation-table-for-encodeが あれば, これは使用する変換表を指定します. さもなければ, 変数standard-character-translation-table-for-encodeが 使用する変換表を指定します.

Variable: standard-character-translation-table-for-decode

これは, 変換表を指定しないコーディングシステムに対する 復号化時のデフォルトの変換表である.

Variable: standard-character-translation-table-for-encode

これは, 変換表を指定しないコーディングシステムに対する 符号化時のデフォルトの変換表である.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10 コーディングシステム

Emacsがファイルを読み書きしたり, Emacsがサブプロセスへテキストを送ったり サブプロセスからテキストを受け取るときには, コーディングシステム(coding system)で指定される 文字コード変換と行末変換を行います.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10.1 コーディングシステムの基本概念

文字コード変換(character code conversion)とは, Emacsの内部で使用する符号と他の符号とのあいだでの変換のことです. Emacsでは, 相互に変換できる多くの異なる符号を扱えます. たとえば, Emacsは, Latin 1, Latin 2, Latin 3, Latin 4, Latin 5, ISO 2022のいくつかの変種を相互に変換できます. 同じ文字集合に対する異なる符号を扱うこともできます. たとえば, キリル(ロシア語)文字に対しては ISO, Alternativnyj, KOI8の3つのコーディングシステムがあります.

ほとんどのコーディングシステムでは変換する文字コードを特定しますが, 指定せずにデータに基づいて発見的手法で選ぶものもあります.

行末変換(end of line conversion)は, ファイル内の行の終りを表すさまざまなシステムで 使われている3つの異なる慣習を扱います. UNIXの慣習では, 行送り文字(改行文字とも呼ぶ)を使います. DOSの慣習では, 行末には復帰と行送りの2文字の列を使います. Macの慣習では, 復帰のみを使います.

latin-1のような基底コーディングシステム(base coding system) では, 行末変換を指定せずにデータに基づいて選びます. latin-1-unix, latin-1-dos, latin-1-macのような 変種コーディングシステム(variant coding system)では, 明示的に行末変換も指定します. ほとんどの基底コーディングシステムには, ‘-unix’, ‘-dos’, ‘-mac’を付加して作られる名前の 対応する3つの変種があります.

コーディングシステムraw-textは 文字コード変換を行わない特別なもので, このコーディングシステムで訪問したバッファはユニバイトバッファになります. 行末変換も指定しないので内容に基づいて決定でき, 行末変換を指定する3つの変種もあります. no-conversionraw-text-unixに等価であり, 文字コードも行末も変換しないことを指定します.

コーディングシステムemacs-muleは, Emacs内部での符号でデータを表現することを指定します. これは, コード変換を行わないという意味ではraw-textに似ていますが, 結果がマルチバイトデータになる点が異なります.

Function: coding-system-get coding-system property

この関数は, コーディングシステムcoding-systemの指定した属性を返す. コーディングシステムのほとんどの属性は内部目的用であるが, 読者が有用と思うものが1つ, 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の値は, コーディングシステムの別名としても定義されている.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10.2 符号化と入出力

コーディングシステムの主目的は, ファイルの読み書きに使うことです. 関数insert-file-contentsはファイルのデータを復号化するために コーディングシステムを使い, write-regionはバッファ内容を符号化するために コーディングシステムを使います.

使用するコーディングシステムを明示する(see section 1つの操作向けにコーディングシステムを指定する) こともできるし, デフォルトの機構(see section デフォルトのコーディングシステム)を暗に使うこともできます. しかし, これらの方式ではすべきことを完全に指定しきれないこともあります. たとえば, undefinedのようなコーディングシステムを選んで, データに基づいて文字コード変換を行うようにするかもしれません. そのような場合, コーディングシステムの選択は 入出力操作によって完了します. しばしば, 選択されたコーディングシステムをあとで知りたくなります.

Variable: buffer-file-coding-system

この変数は, カレントバッファで訪問するときに使用した コーディングシステムを記録する. これは, バッファを保存したり, write-regionでバッファの一部を書くときに使われる. これらの操作において, ユーザーに別のコーディングシステムを指定するように 問い合わせた場合には, buffer-file-coding-systemは 指定された別のコーディングシステムに更新される.

Variable: save-buffer-coding-system

この変数は, write-regionには使わないが, バッファを保存するために使うコーディングシステムを指定する. バッファを保存する際に, ユーザーに別のコーディングシステムを指定するように 問い合わせ, かつ, save-buffer-coding-systemを用いている場合には, これは指定された別のコーディングシステムに更新される.

Variable: last-coding-system-used

ファイルやサブプロセスに対する入出力操作では, 使用したコーディングシステム名をこの変数に設定する. 明示的に符号化/復号化する関数(see section 明示的な符号化と復号化)も この変数に設定する.

警告: サブプロセスから出力を受け取るとこの変数が設定されるため, Emacsが待つたびに変化する可能性がある. したがって, 読者の興味がある値を保存するような関数を呼び出した直後に その値をコピーして使うこと.

変数selection-coding-systemは, ウィンドウシステムのセレクションを符号化する方法を指定します. See section ウィンドウシステムのセレクション.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10.3 Lispにおけるコーディングシステム

コーディングシステムを扱うLispの機能について述べます.

Function: coding-system-list &optional base-only

この関数は, すべてのコーディングシステム名(シンボル)のリストを返す. base-onlynil以外であると, 値には基底コーディングシステムのみを含める. さもなければ, 値には変種コーディングシステムも含まれる.

Function: coding-system-p object

この関数は, objectがコーディングシステム名であるとtを返す.

Function: check-coding-system coding-system

この関数は, coding-systemの正当性を調べる. 正しいものならばcoding-systemを返す. さもなければ, 条件coding-system-error付きのエラーを通知する.

Function: coding-system-change-eol-conversion coding-system eol-type

この関数は, coding-systemに類似のコーディングシステムを返すが, eol-typeで指定された行末変換のものである. eol-typeは, unix, dos, mac, nilの いずれかであること. nilであると, 返されたコーディングシステムは, データから行末変換を決定する.

Function: coding-system-change-text-conversion eol-coding text-coding

この関数は, 行末変換にeol-codingを使い, テキストの変換にtext-codingを使っているコーディングシステムを返す. text-codingnilであると, undecidedeol-codingに応じたundecidedの変種の1つを返す.

Function: find-coding-systems-region from to

この関数は, fromtoのあいだのテキストの符号化に使用できる コーディングシステムのリストを返す. リスト内のすべてのコーディングシステムは, 当該部分のテキストの どんなマルチバイト文字も安全に符号化できる.

テキストにマルチバイト文字が含まれない場合, 関数はリスト(undecided)を返す.

Function: find-coding-systems-string string

この関数は, 文字列stringのテキストの符号化に使用できる コーディングシステムのリストを返す. リスト内のすべてのコーディングシステムは, stringの どんなマルチバイト文字も安全に符号化できる. テキストにマルチバイト文字が含まれない場合, これはリスト(undecided)を返す.

Function: find-coding-systems-for-charsets charsets

この関数は, リストcharsets内のすべての文字集合の符号化に使用できる コーディングシステムのリストを返す.

Function: detect-coding-region start end &optional highest

この関数は, startからendまでのテキストを復号化する もっともらしいコーディングシステムを選ぶ. このテキストは『生のバイト』(see section 明示的な符号化と復号化)であること.

この関数は, 通常, 走査したテキストの復号化を扱える コーディングシステムのリストを返す. それらは優先順位の降順に並ぶ. しかし, highestnil以外であると, 戻り値はもっとも順位の高い1つのコーディングシステムである.

領域にASCII文字だけが含まれる場合, 値はundecided(undecided)である.

Function: detect-coding-string string highest

この関数はdetect-coding-regionと同様であるが, バッファ内のバイトのかわりに文字列stringの内容に作用する.

サブプロセスとの入出力に使用されるコーディングシステムを 調べたり設定する方法については, See section プロセス情報.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10.4 ユーザー指定のコーディングシステム

Function: select-safe-coding-system from to &optional preferred-coding-system

この関数はfromtoのあいだのテキストを符号化する コーディングシステムを選ぶが, 必要ならばユーザーに問い合わせる.

省略可能な引数preferred-coding-systemは, 最初に試すコーディングシステムを指定する. それが指定領域のテキストを処理できるならば, それを使う. この引数を省略すると, buffer-file-coding-systemのカレントバッファでの値をまず試す.

領域内にpreferred-coding-systemで符号化できない マルチバイト文字がある場合, この関数は, 当該テキストを符号化可能なコーディングシステム一覧から ユーザーに選択してもらい, ユーザーが選択したものを返す.

特殊機能: fromが文字列であると, 文字列を調べる対象とし, toは無視する.

補完を用いてユーザーにコーディングシステムを指定させるために使える 2つの関数はつぎのとおりです. See section 補完.

Function: read-coding-system prompt &optional default

この関数は, 文字列promptをプロンプトとして ミニバッファを使ってコーディングシステムを読み取り, コーディングシステム名をシンボルとして返す. ユーザーの入力が空であると, defaultは返すべきコーディングシステムを指定する. それはシンボルか文字列であること.

Function: read-non-nil-coding-system prompt

この関数は, 文字列promptをプロンプトとして ミニバッファを使ってコーディングシステムを読み取り, コーディングシステム名をシンボルとして返す. ユーザーが空を入力しようとすると再度問い合わせる. see section コーディングシステム.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10.5 デフォルトのコーディングシステム

本節では, 特定のファイルや特定のサブプログラムを実行するときの デフォルトのコーディングシステムを指定する変数と, それらを使った入出力操作を行う関数について述べます.

これらの変数の目的は, 読者が望むデフォルトをいったんこれらに設定しておけば, 再度変更する必要がないようにすることです. Lispプログラムの特定の操作向けに特定のコーディングシステムを指定するには, これらの変数を変更しないでください. かわりに, coding-system-for-readcoding-system-for-writeを 使って上書きします(see section 1つの操作向けにコーディングシステムを指定する).

Variable: file-coding-system-alist

この変数は, 特定のファイルの読み書きに使用する コーディングシステムを指定する連想リストである. 各要素は(pattern . coding)の形であり, patternは特定のファイル名に一致する正規表現である. patternに一致するファイル名に当該要素を適用する.

要素のCDR, codingはコーディングシステムであるか, 2つのコーディングシステムを収めたコンスセルであるか, 関数シンボルであること. codingがコーディングシステムであると, ファイルの読み書きの両方にそのコーディングシステムを使う. codingが2つのコーディングシステムを収めたコンスセルであると, そのCARは復号化に使うコーディングシステムを指定し, そのCDRは符号化に使うコーディングシステムを指定する.

codingが関数シンボルであると, その関数は, コーディングシステムか, 2つのコーディングシステムを収めたコンスセルを返すこと. その値は上に述べたように使われる.

Variable: process-coding-system-alist

この変数は, サブプロセスで実行しているプログラムに依存して サブプロセスに使うコーディングシステムを指定する連想リストである. file-coding-system-alistと同様に働くが, patternはサブプロセスを始めるために用いたプログラム名に対して 一致を取る点が異なる. この連想リストに指定したコーディングシステムは, サブプロセスとの入出力に使用するコーディングシステムの初期化に用いれるが, set-process-coding-systemを使って, あとで別のコーディングシステムを指定できる.

警告: データからコーディングシステムを決定するundecidedのような コーディングシステムは, 非同期サブプロセスの出力に対しては 完全に信頼性のある動作はできない. これは, Emacsが非同期サブプロセスの出力が 到着するたびに一塊で処理するからである. コーディングシステムが文字コード変換や行末変換を未指定にしていると, Emacsは1つの塊から正しい変換を検出しようと試みるが, これがつねに動作するとは限らない.

したがって, 非同期サブプロセスでは, 可能な限り 文字コード変換と行末変換の両方を指定したコーディングシステムを使います. つまり, undecidedlatin-1などではなく, latin-1-unixのようなものを使います.

Variable: network-coding-system-alist

この変数は, ネットワークストリームに使用するコーディングシステムを 指定する連想リストである. file-coding-system-alistと同様に働くが, 要素内のpatternはポート番号か正規表現である点が異なる. それが正規表現であると, ネットワークストリームを開くために 使用したネットワークサービス名に対して一致をとる.

Variable: default-process-coding-system

この変数は, なにも指定されていないサブプロセス(やネットワークストリーム) の入出力に使用するコーディングシステムを指定する.

値は, (input-coding . output-coding)の形の コンスセルであること. ここで, input-codingはサブプロセスからの入力に適用され, output-codingはそれへの出力に適用される.

Function: find-operation-coding-system operation &rest arguments

この関数は, argumentsを指定してoperationを行うときに (デフォルトで)使用されるコーディングシステムを返す. その値はつぎの形である.

 
(decoding-system encoding-system)

第1要素decoding-systemは (operationが復号化を行う場合には)復号化に用いる コーディングシステムであり, encoding-systemは (operationが符号化を行う場合には)符号化に用いる コーディングシステムである.

引数operationは, Emacsの入出力基本関数の insert-file-contents, write-region, call-process, call-process-region, start-process, open-network-streamのいずれかであること.

残りの引数は, これらの入出力基本関数に指定するであろう引数と同じであること. 基本関数に依存して, 引数の1つを対象として選ぶ. たとえば, operationがファイル入出力を行う場合, ファイル名を指定する引数が対象である. サブプロセスの基本関数では, プロセス名が対象である. open-network-streamでは, サービス名やポート番号が対象である.

この関数は, operationに応じて当該対象を file-coding-system-alistprocess-coding-system-alistnetwork-coding-system-alistで探す. see section デフォルトのコーディングシステム.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10.6 1つの操作向けにコーディングシステムを指定する

変数coding-system-for-readと/やcoding-system-for-writeを 束縛することで, 特定の1つの操作向けのコーディングシステムを指定できます.

Variable: coding-system-for-read

この変数がnil以外であると, ファイルを読むときや同期プロセスからの入力に用いる コーディングシステムを指定する.

これは非同期プロセスやネットワークストリームにも適用されるが, 異なった方法で適用される. サブプロセスを開始したりネットワークストリームを開いたときの coding-system-for-readの値は, そのサブプロセスやネットワークストリームの入力の復号化方法を指定する. 変更されない限り, そのサブプロセスやネットワークストリームに 対して使われ続ける.

この変数の正しい使い方は, 特定の入出力操作に対して letで束縛することである. そのグローバルな値は通常はnilであり, グローバルにこれ以外の値を設定するべきではない. この変数の正しい使い方の例をつぎに示す.

 
;; 文字コード変換せずにファイルから読む
;; CRLFが行末を表すと仮定する
(let ((coding-system-for-write 'emacs-mule-dos))
  (insert-file-contents filename))

その値がnil以外であると, coding-system-for-readは, file-coding-system-alist, process-coding-system-alist, network-coding-system-alist, を含めて入力に用いるコーディングシステムの 他のすべての指定方法に優先する.

Variable: coding-system-for-write

これはcoding-system-for-readと同様に働くが, 入力ではなく出力に適用される点が異なる. ファイル, サブプロセス, ネットワーク接続へ書くことに影響する.

call-process-regionstart-processのように, 1つの操作で入力と出力を行うときには, coding-system-for-readcoding-system-for-writeの 両方が影響する.

Variable: inhibit-eol-conversion

この変数がnil以外であると, コーディングシステムでなにが指定されていようと行末変換を行わない. これは, Emacsの入出力とサブプロセスのすべての基本関数, 明示的な符号化/復号化関数(see section 明示的な符号化と復号化)に適用される.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10.7 明示的な符号化と復号化

Emacsへ/からテキストを転送するすべての操作には, テキストを符号化したり復号化するコーディングシステムを使う能力があります. 本節に述べる関数を用いてテキストを明示的に符号化したり復号化できます.

符号化の結果と復号化する入力は, 通常のEmacsのテキストではありません. それらは『生のバイト』, つまり, 外部ファイルと同じ方法で テキストを表現するバイト列です. バッファに生のバイトが収められている場合, set-buffer-multibyte(see section 表現の選択)を用いて バッファはユニバイト表現であると印を付けるのがもっとも自然ですが, これは必須ではありません. バッファの内容が単に一時的に生のバイトであるときには, バッファはマルチバイトのままにしておきます. バッファ内容を復号化すれば正しくなります.

明示的に復号化するためにバッファに生のバイトを入れる普通の方法は, insert-file-contents-literally(see section ファイルの読み込み)で ファイルから読むか, find-file-noselectでファイルを訪問するときに引数rawfilenil以外を指定します.

テキストの明示的な符号化で得た結果である生のバイトを使う普通の方法は, ファイルやプロセスへそれらをコピーします. たとえば, write-region(see section ファイルへの書き出し)でそれらを書くには, coding-system-for-writeno-conversionを束縛して write-regionの符号化を抑制します.

生のバイトには, 正しいマルチバイト文字に 余分なトレイリングコードが付いたように見える長すぎるバイト列が 含まれる場合があります. ほとんどの目的には, バッファや文字列のそのような列をEmacsは1文字として扱い, その文字コードを調べるとマルチバイト文字の列に対応した値を得るはずです. 余分なバイト列は無視されます. このふるまいは透明性がよくありませんが, 生のバイトはEmacsの限定された場面でのみ使われ, 実用上の問題は回避できます.

Function: encode-coding-region start end coding-system

この関数は, コーディングシステムcoding-systemに従って startからendのテキストを符号化する. 符号化結果はバッファ内のもとのテキストを置き換える. 符号化結果は『生のバイト』であるが, マルチバイトであったバッファはマルチバイトのままである.

Function: encode-coding-string string coding-system

この関数は, コーディングシステムcoding-systemに従って 文字列stringのテキストを符号化する. 符号化したテキストを含む新たな文字列を返す. 符号化結果は『生のバイト』のユニバイト文字列である.

Function: decode-coding-region start end coding-system

この関数は, コーディングシステムcoding-systemに従って startからendのテキストを復号化する. 復号化結果はバッファ内のもとのテキストを置き換える. 明示的な復号化が有用であるためには, 復号化前のテキストは『生のバイト』であること.

Function: decode-coding-string string coding-system

この関数は, コーディングシステムcoding-systemに従って 文字列stringのテキストを復号化する. 復号化したテキストを含む新たな文字列を返す. 明示的な復号化が有用であるためには, 復号化前のstringの内容は『生のバイト』であること.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10.8 端末入出力の符号化

Emacsは, コーディングシステムを用いてキーボード入力を復号化したり, 端末出力を符号化できます. Latin-1などの特定の符号を用いてテキストを送信したり表示する 端末に対しては, これは有用です. Emacsは, 端末に対する符号化や復号化では last-coding-system-usedに設定しません.

Function: keyboard-coding-system

この関数は, キーボード入力の復号化に用いている コーディングシステムを返す. コーディングシステムを使用していなければnilを返す.

Function: set-keyboard-coding-system coding-system

この関数は, キーボード入力の復号化に使用するコーディングシステムとして coding-systemを指定する. coding-systemnilであると, キーボード入力に復号化を用いないことを意味する.

Function: terminal-coding-system

この関数は, 端末出力の符号化に用いている コーディングシステムを返す. コーディングシステムを使用していなければnilを返す.

Function: set-terminal-coding-system coding-system

この関数は, 端末出力の符号化に使用するコーディングシステムとして coding-systemを指定する. coding-systemnilであると, 端末出力に符号化を用いないことを意味する.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

32.10.9 MS-DOSのファイル型

MS-DOSやMS-Windows上のEmacsは, 特定のファイル名をテキストファイルやバイナリファイルとして認識します. 『バイナリファイル』とは, 必ずしも文字を意味しないバイト値のファイルです. Emacsは, バイナリファイルに対しては行末変換や文字コード変換を行いません. 一方, その名前から『テキストファイル』と印が付いた 新規ファイルを作成すると, EmacsはDOSの行末変換を行います.

Variable: buffer-file-type

この変数は, 各バッファで自動的にバッファローカルになり, バッファで訪問したファイルのファイル型を記録する. バッファがbuffer-file-coding-systemで コーディングシステムを指定しない場合, バッファ内容を書き出すときに用いるコーディングシステムを この変数を用いて決定する. テキストに対してはnil, バイナリに対してtであること. これがtであると, コーディングシステムはno-conversionである. さもなければ, undecided-dosを用いる.

通常, この変数はファイルを訪問すると設定される. いかなる変換も行わずにファイルを訪問するとnilに設定される.

User Option: file-name-buffer-file-type-alist

この変数は, テキスト/バイナリファイルを認識するための連想リストを保持する. 各要素は(regexp . type)の形である. ここで, regexpはファイル名に対して一致をとり, typeは, テキストファイルではnil, バイナリファイルではt, あるいは, どちらであるかを計算するために呼び出す関数である. それが関数であると, 1つの引数(ファイル名)で呼ばれ, tnilを返すこと.

MS-DOSやMS-Windowsで動作しているEmacsは, この連想リストを調べて, ファイルを読む際に使用する コーディングシステムを決定する. テキストファイルではundecided-dosが使われる. バイナリファイルではno-conversionが使われる.

指定したファイルがこの連想リストの要素に一致しないと, default-buffer-file-typeがファイルの扱い方を指定する.

User Option: default-buffer-file-type

この変数は, file-name-buffer-file-type-alistが指定しない型の ファイルの扱い方を指定する.

この変数がnil以外であると, そのようなファイルはバイナリとして扱われ, コーディングシステムno-conversionを用いる. さもなければそれらに対して特別なことを行わずに, Emacsの通常のとおりにファイル内容からコーディングシステムを決定する.



[ << ] [ >> ]           [冒頭] [目次] [見出し] [ ? ]

この文書は新堂 安孝によって2009年9月22日texi2html 1.82を用いて生成されました。