次: , 前: Text Representations, 上: Non-ASCII Characters


32.2 テキスト表現の変換

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

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

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

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

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

— 変数: nonascii-insert-offset

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

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

— 変数: nonascii-translation-table

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

— 機能: string-make-unibyte string

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

— 機能: string-make-multibyte string

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