次: , 前: Floating Point Type, 上: Programming Types


2.3.3 文字型

Emacs Lispにおける文字(character)は、 整数以外の何物でもありません。 いいかえれば、文字はその文字コードで表現されます。 たとえば、文字Aは整数 65と表現されます。

プログラムで個々の文字を独立に使うことはあまりありません。 文字を並べた文字列(strings)として扱うことが断然多いのです。 See String Type

文字列内、バッファ内、ファイル内の文字は、 現時点では、0から524287までの範囲、19ビット長に制限されます。 しかし、この範囲の値すべてが正しい文字コードではありません。 0から127までのコードはASCIIコードです。 それ以外は、非ASCIIです(see Non-ASCII Characters)。 キーボード入力を表す文字は、コントロール、メタ、シフトなどの 修飾キーを符号化するために、範囲がより広くなります。

文字は、実際には整数ですから、文字の表示表現は10進数です。 また、文字の入力構文として10進数も可能ですが、 Lispプログラムでこのように文字を書くのは最悪です。 Emacs Lispに用意してある文字向けの特別な入力構文を つねに使うべきです。 これらの構文は疑問符で始まります。

英数字向けの普通の入力構文は、疑問符に続けて1つの英数字を書きます。 したがって、文字Aは`?A'、文字Bは`?B'、 文字aは`?a'と書きます。

たとえば、つぎのとおりです。

     ?Q => 81     ?q => 113

同じ入力構文を句読点文字にも使えますが、 `\'を追加して、Lispコードを編集するEmacsコマンドが混乱しないように することがよいでしょう。 たとえば、空白文字は`?\ 'と書きます。 文字`\'は、クォートするために2つめの`\'を使う必要があり `?\\'です。

コントロールg、バックスペース、タブ、改行、 垂直タブ、ページ送り、復帰、エスケープは、 それぞれ、`?\a'、`?\b'、`?\t'、`?\n'、`?\v'、 `?\f'、`?\r'、`?\e'と書きます。 つまり、つぎのとおりです。

     ?\a => 7                 ; C-g
     
     
     
     
     
     
     
     
     ?\b => 8                 ; バックスペース、 <BS>、C-h
     ?\t => 9                 ; タブ、 <TAB>、C-i
     ?\n => 10                ; 改行、C-j
     ?\v => 11                ; 垂直タブ、C-k
     ?\f => 12                ; ページ送り文字、C-l
     ?\r => 13                ; 復帰、<RET>, C-m
     ?\e => 27                ; エスケープ文字、<ESC>、C-[
     ?\\ => 92                ; バックスラッシュ文字、\

バックスラッシュで始まる系列は エスケープシーケンス(escape sequences)とも呼びます。 バックスラッシュが、エスケープ文字の役割を果たすからです。 この使い方は、文字<ESC>とは関係ありません。

コントロール文字は別の入力構文でも表現できます。 疑問符に続けてバックスラッシュ、カレット(`^')、そして、 対応するコントロールでない文字を大文字か小文字で書きます。 たとえば、`?\^I'も`?\^i'も、 値が9である文字C-iの正しい入力構文です。

カレットのかわりに、`C-'を使ってもかまいません。 ですから、`?\C-i'は、`?\^I'や`?\^i'と等価です。

     ?\^I => 9     ?\C-I => 9

文字列やバッファ内ではASCIIのコントロール文字だけが許されますが、 キーボード入力においては`C-'で任意の文字をコントロール文字にできます。 これらの非ASCIIコントロール文字の文字コードは、 対応する非コントロール文字の文字コードと のビットを含みます。 普通の端末では、非ASCIIコントロール文字を生成する手立てはありませんが、 Xウィンドウシステムや他のウィンドウシステムでは、 簡単に生成できます。

歴史的な理由で、 Emacsは<DEL>文字を?に対応したコントロール文字として扱います。

     ?\^? => 127     ?\C-? => 127

その結果、今のところ、 Xウィンドウシステムのもとでは意味のある文字Control-?を `\C-'では表現できません。

ファイルや文字列に現れるコントロール文字を表現するには、 `^'構文を勧めます。 キーボード入力のコントロール文字には、`C-'構文が好ましいです。 どちらを使ってもプログラムの意味には影響しませんが、 それを読む人には理解の手助けになるかもしれません。

メタ文字(meta character)は、 <META>修飾キーを使って打った文字です。 そのような文字を表す整数は、(ほとんどの計算機では負の数になる) のビットがセットされています。 上位のビットをメタや他の修飾子に用いることで、 基本となる文字コードの範囲をできるだけ大きくします。

文字列では、メタ文字を表すASCII文字には のビットを付加します。 つまり、文字列に収められるメタ文字のコードは128から255の範囲であり、 任意のASCII文字のメタ変種を使えます。 (Emacs 18やそれ以前では、この方式を文字列の外にある文字にも使っていた。)

メタ文字の入力構文には`\M-'を使います。 たとえば、`?\M-A'はM-Aです。 `\M-'と一緒に8進文字コードも使えますし(下記参照)、 `\C-'や文字向けの他の構文も使えます。 したがって、M-Aは`?\M-A'と書いたり`?\M-\101'と書けます。 同様に、C-M-bは`?\M-\C-b'、 `?\C-\M-b'、`?\M-\002'と書けます。

図形文字の大文字小文字は、その文字コードで示されます。 たとえば、ASCIIでは`a'と`A'の文字を区別します。 しかし、ASCIIではコントロール文字の大文字小文字を表現できません。 Emacsでは、コントロール文字を打つときに使ったシフトキーを表すために のビットを付加します。 このような区別はX端末や他の特別な端末を使っている場合に限り可能です。 普通の端末ではこのような区別を計算機に送れません。

Xウィンドウシステムでは、 文字に設定可能な修飾ビットが他に3つあります。 ハイパー(hyper)、スーパー(super)、アルト(alt)です。 これらの修飾ビットの構文は、 `\H-'、`\s-'、`\A-'です。 (これらのプレフィックスでは、大文字小文字を区別する。) したがって、`?\H-\M-\A-x'はAlt-Hyper-Meta-xを表します。

文字向けのもっとも汎用の入力構文では、 文字コードを8進数や16進数で表現します。 8進数を使うには、順に、 疑問符、バックスラッシュ、(3桁までの)8進数字文字コードを書きます。 たとえば、`?\101'は文字Aを表し、 `?\001'は文字C-aを表し、?\002は文字C-bを表します。 この構文で任意のASCII文字を表現できますが、 ASCIIでの表現よりも8進数値で表現することが重要な場合に限るべきです。

     ?\012 => 10         ?\n => 10         ?\C-j => 10
     ?\101 => 65         ?A => 65

16進数を使うには、順に、疑問符、バックスラッシュ、 `x'、16進数字文字コードを書きます。 16進数の桁数はいくつでもよいので、任意の文字コードを表現できます。 したがって、`?\x41'は文字Aを表し、 `?\x1'は文字C-aを表し、 ?\x8e0

特別なエスケープの意味を持たないどんな文字のまえにもバックスラッシュを 付けることができ、しかも、無害です。 したがって、`?\+'は`?+'に等価です。 ほとんどの文字のまえにバックスラッシュを付ける理由はありません。 しかしながら、Lispコードを編集するEmacsコマンドが混乱しないように、 `()\|;'`"#.,'のいずれかの文字のまえにはバックスラッシュを付けるべきです。 空白、タブ、改行、ページ送りのような白文字のまえにも バックスラッシュを付けるべきです。 しかしながら、タブなどの実際の白文字のかわりに、 `\t'などの読みやすいエスケープシーケンスを使ったほうが明確です。