[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32. 非ASCII文字

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Non-ASCII%20Characters"
"texi/elisp21/非ASCII文字"へのコメント(無し)

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.1 テキスト表現

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Text%20Representations"
"texi/elisp21/テキスト表現"へのコメント(無し)

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を返す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.2 テキスト表現の変換

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Converting%20Representations"
"texi/elisp21/テキスト表現の変換"へのコメント(無し)

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

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

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

ユニバイトテキストをマルチバイトテキストに変換しても ASCII文字は無変更であり、128から159も同様です。 160から255の非ASCIIについては、 各文字にnonascii-insert-offsetの値を加算することで変換します。 この変数に設定すると、ユニバイト文字がどの文字集合に対応するかを指定できます (see 節 32.5 文字集合)。 たとえば、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がマルチバイトであれば無変更で返す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.3 表現の選択

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Selecting%20a%20Representation"
"texi/elisp21/表現の選択"へのコメント(無し)

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

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そのものである。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.4 文字コード

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Character%20Codes"
"texi/elisp21/文字コード"へのコメント(無し)

ユニバイトとマルチバイトのテキスト表現では、 異なる文字コードを使っています。 ユニバイト表現において正しい文字コードは0から255の範囲であり、 これらの値は1バイトに収まります。 マルチバイト表現において正しい文字コードは0から524287の範囲ですが、 この範囲のすべての値が正しいとは限りません。 特に、値128から255は (『生のバイト』にはありうる。see 節 32.10.7 明示的な符号化と復号化)、 マルチバイトテキストでは正しくありません。 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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.5 文字集合

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Character%20Sets"
"texi/elisp21/文字集合"へのコメント(無し)

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が属する文字集合の名前を返す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.6 文字とバイト

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Chars%20and%20Bytes"
"texi/elisp21/文字とバイト"へのコメント(無し)

マルチバイト表現では、各文字は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))



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.7 文字の分割

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Splitting%20Characters"
"texi/elisp21/文字の分割"へのコメント(無し)

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

Function: char-bytes character
この関数は、文字characterを表現するために必要なバイト数を返す。 これは、文字characterが属する文字集合だけに依存し、 その文字集合(see 節 32.5 文字集合)の次元とその導入列の和に等しい。

 
(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 節 6.6 文字テーブル)。 char-valid-pは汎用文字に対してはnilを返す。 たとえばつぎのとおり。

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.8 文字集合の走査

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Scanning%20Charsets"
"texi/elisp21/文字集合の走査"へのコメント(無し)

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

Function: find-charset-region beg end &optional translation
この関数は、カレントバッファのbegendのあいだに 現れる文字集合のリストを返す。

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

Function: find-charset-string string &optional translation
この関数は、文字列stringに現れる文字集合のリストを返す。

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.9 文字の変換

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Translation%20of%20Characters"
"texi/elisp21/文字の変換"へのコメント(無し)

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

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

1つの文字集合全体を同じ次元の別の文字集合へ対応付けることも可能である。 それには、fromに(文字集合を表す)汎用文字を指定する (see 節 32.7 文字の分割)。 この場合、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
これは、変換表を指定しないコーディングシステムに対する 符号化時のデフォルトの変換表である。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.10 コーディングシステム

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Coding%20Systems"
"texi/elisp21/コーディングシステム"へのコメント(無し)

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

32.10.1 コーディングシステムの基本概念   
32.10.2 符号化と入出力   
32.10.3 Lispにおけるコーディングシステム   
32.10.4 ユーザー指定のコーディングシステム   
32.10.5 デフォルトのコーディングシステム   
32.10.6 1つの操作向けにコーディングシステムを指定する   
32.10.7 明示的な符号化と復号化   
32.10.8 端末入出力の符号化   
32.10.9 MS-DOSのファイル型   



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Coding%20System%20Basics"
"texi/elisp21/コーディングシステムの基本概念"へのコメント(無し)

文字コード変換(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-unixlatin-1-doslatin-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の値は、 コーディングシステムの別名としても定義されている。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.10.2 符号化と入出力

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Encoding%20and%20I/O"
"texi/elisp21/符号化と入出力"へのコメント(無し)

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

使用するコーディングシステムを明示する(see 節 32.10.6 1つの操作向けにコーディングシステムを指定する) こともできるし、 デフォルトの機構(see 節 32.10.5 デフォルトのコーディングシステム)を暗に使うこともできます。 しかし、これらの方式ではすべきことを完全に指定しきれないこともあります。 たとえば、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 節 32.10.7 明示的な符号化と復号化)も この変数に設定する。

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

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Lisp%20and%20Coding%20Systems"
"texi/elisp21/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は、unixdosmacnilの いずれかであること。 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 節 32.10.7 明示的な符号化と復号化)であること。

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

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

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

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=User-Chosen%20Coding%20Systems"
"texi/elisp21/ユーザー指定のコーディングシステム"へのコメント(無し)

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 節 19.5 補完

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

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Default%20Coding%20Systems"
"texi/elisp21/デフォルトのコーディングシステム"へのコメント(無し)

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

これらの変数の目的は、読者が望むデフォルトをいったんこれらに設定しておけば、 再度変更する必要がないようにすることです。 Lispプログラムの特定の操作向けに特定のコーディングシステムを指定するには、 これらの変数を変更しないでください。 かわりに、coding-system-for-readcoding-system-for-writeを 使って上書きします(see 節 32.10.6 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-contentswrite-regioncall-processcall-process-regionstart-processopen-network-streamのいずれかであること。

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

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Specifying%20Coding%20Systems"
"texi/elisp21/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-alistprocess-coding-system-alistnetwork-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 節 32.10.7 明示的な符号化と復号化)に適用される。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Explicit%20Encoding"
"texi/elisp21/明示的な符号化と復号化"へのコメント(無し)

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

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

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

テキストの明示的な符号化で得た結果である生のバイトを使う普通の方法は、 ファイルやプロセスへそれらをコピーします。 たとえば、write-region(see 節 24.4 ファイルへの書き出し)でそれらを書くには、 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の内容は『生のバイト』であること。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.10.8 端末入出力の符号化

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Terminal%20I/O%20Encoding"
"texi/elisp21/端末入出力の符号化"へのコメント(無し)

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であると、 端末出力に符号化を用いないことを意味する。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.10.9 MS-DOSのファイル型

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=MS-DOS%20File%20Types"
"texi/elisp21/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の通常のとおりにファイル内容からコーディングシステムを決定する。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

32.11 入力方式

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Input%20Methods"
"texi/elisp21/入力方式"へのコメント(無し)

入力方式(input method)は、 キーボードから非ASCII文字を入力する簡便な方法を提供します。 プログラムが読み取るための非ASCII文字の符号変換を行う コーディングシステムと異なり、 入力方式は人間向けのコマンドを提供します。 (テキストを入力するための入力方式の使い方については、 see GNU Emacs マニュアル。) 入力方式の定義方法については本書ではまだ明文化してありませんが、 ここではそれらの使い方について述べます。

各入力方式には名前があります。 それは現在のところ文字列ですが、 将来は入力方式名としてシンボルも使えるようになります。

Variable: current-input-method
この変数は、カレントバッファで現在活性な入力方式の名前を保持する。 (この変数に設定すると自動的にバッファローカルになる。) nilであると、バッファでは入力方式が活性ではない。

Variable: default-input-method
この変数は、入力方式を選ぶコマンド向けのデフォルトの入力方式を保持する。 current-input-methodと異なり、この変数は通常はグローバルである。

Function: set-input-method input-method
この関数は、カレントバッファにおいて 入力方式input-methodを活性にする。 default-input-methodにもinput-methodを設定する。 input-methodnilであると、 この関数はカレントバッファの入力方式を不活性にする。

Function: read-input-method-name prompt &optional default inhibit-null
この関数は、プロンプトpromptを用いてミニバッファで入力方式名を読む。 defaultnil以外であると、 ユーザーが空の入力をするとデフォルトでこれを返す。 しかし、inhibit-nullnil以外であると、 空の入力はエラーを通知する。

戻り値は文字列である。

Variable: input-method-alist
この変数は、使用可能なすべての入力方式を定義する。 各要素は1つの入力方式を定義し、つぎの形であること。

 
(input-method language-env activate-func
 title description args...)

ここで、input-methodは入力方式名であり文字列である。 language-envも別の文字列であり当該入力方式を 推奨する言語環境の名前である。 (これは説明文目的のためだけである。)

titleは、この入力方式が活性である場合に モード行に表示される文字列である。 descriptionはこの入力方式と何向きであるかを 説明する文字列である。

activate-funcは、この入力方式を活性にするために呼び出す関数である。 argsがあればactivate-funcへの引数として渡される。 つまり、activate-funcの引数はinput-methodargsである。

入力方式に対する基本的なインターフェイスは 変数input-method-functionを介して行います。 See 節 20.6.2 単一イベントの読み取り


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端]