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

16. 国際化文字集合の使い方

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=International"
"emacs/国際化文字集合の使い方"へのコメント(無し)

Emacsでは広範囲の国際化文字集合を使えます。 ラテンアルファベットの変種であるヨーロッパの言語はもちろん、中国語、 デバナーガリー(ヒンディー語とマラッタ語)、エチオピア語、ギリシア語、 IPA(International Phonetic Alphabet、万国表音文字)、日本語、韓国語、 ラオ語、ロシア語、タイ語、チベット語、ベトナム語の文字を含んでいます。 これらの機能は、MULE(『MULti-lingual Enhancement to GNU Emacs』)と して知られるEmacsの修正版から併合しました。



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

16.1 国際化文字集合の紹介

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=International%20Intro"
"emacs/国際化文字集合の紹介"へのコメント(無し)

これらの文字のユーザーは、ファイルに格納するために、 たくさんの標準的なコーディングシステムを確立してきました。 Emacsは内部的には単一のマルチバイト文字符号化を使用しているので、 1つのバッファや1つの文字列の中に、 これらのすべての文字を混ぜ合わせることができます。 この符号化では、非ASCII文字を0200から0377の範囲のバイトの 並びとして表現します。 Emacsは、ファイルを読み書きするとき、サブプロセスとデータを交換するとき、 (場合によっては)C-qコマンドを使うときに、 マルチバイト文字符号化と 他のさまざまなコーディングシステムのあいだで変換します (see 節 16.6 ユニバイトとマルチバイトの非ASCII文字)。

コマンドC-h hview-hello-file)は、 多くの言語で『hello』と書いたファイル`etc/HELLO'を表示します。 これは、さまざまな字体を例示します。

これらの文字集合を使っている国々であっても、 一般にキーボードには、 それらすべての文字に対するキーはありません。 ですから、Emacsではさまざまな入力方式(input methods) (18)を使って、 便利に文字を打ち込めるようにします。 典型的には、1つの字体や1つの言語について1つの入力方式があります。

プレフィックスキーC-x RETは、 マルチバイト文字、コーディングシステム、入力方式に関係するコマンドに使います。



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

16.2 マルチバイト文字を使用可能にする

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Enabling%20Multibyte"
"emacs/マルチバイト文字を使用可能にする"へのコメント(無し)

Emacs全体やバッファごとにマルチバイト文字の使用可/使用不可を設定できます。 バッファでマルチバイト文字を使用不可にすると、 そのバッファ内の各バイトは1つの文字を表します。 たとえコードが0200から0377のあいだであってもそうです。 ヨーロッパの文字集合であるISO Latin-1とISO Latin-2を扱う古い機能は、 Emacs 19で動作していたように動き、 他のISO 8859文字集合に対しても動作します。

しかし、ISO Latinを使うために、 マルチバイト文字を使用不可にする必要はありません。 Emacsのマルチバイト文字集合にはこれらの文字集合のすべての文字が含まれ、 EmacsはこれらのISOコードと相互に自動的に変換できます。

特定のファイルをユニバイト表現で編集するには、 find-file-literallyを使ってファイルを訪問します。 See 節 12.2 ファイルを訪問する。 マルチバイト表現のバッファを同じ文字の1バイト表現に変換するには、 もっとも簡単な方法は、内容をファイルに保存してから、バッファを削除し、 find-file-literallyでそのファイルを訪問し直します。 C-x RET cuniversal-coding-system-argument)を使って、 ファイルを探したり保存するときのコーディングシステムとして `raw-text'を指定することもできます。 See 節 16.9 コーディングシステムの指定。 `raw-text'としてファイルを探しても、 find-file-literallyのようには、 書式変換、圧縮の展開、モードの自動選択を禁止しません。

デフォルトでマルチバイト文字を使用不可にするには、 `--unibyte'オプション(see 節 A.2 初期化オプション)を 指定してEmacsを始めるか、あるいは、 環境変数`EMACS_UNIBYTE'を設定します。 `--unibyte'と同等な効果を得るには、 enable-multibyte-charactersをカスタマイズするか、 これと等価に、初期化ファイル内で、 変数default-enable-multibyte-charactersを直接設定します。

環境変数の値、`/etc/passwd'の内容などの非ASCII 8ビット文字からの 初期化中にはマルチバイト文字列は作られません。 しかし、`--unibyte'を指定したとしても、 一般のLispファイルのように、初期化ファイルは、通常、 マルチバイトとして読み込みます。 それらに含まれる非ASCII文字からマルチバイト文字列が生成されるのを防ぐには、 1行目の注釈に`-*-unibyte: t;-*-'を入れておきます。 gnusなどのパッケージの初期化ファイルでも同じことをします。

モード行には、カレントバッファでマルチバイト文字が使用可かどうか表示されます。 使用可ならば、モード行の先頭付近のコロンのまえに 2文字か数文字(ほとんどの場合ダッシュ2個)があります。 マルチバイト文字が使用不可ならば、コロンのまえにはダッシュが1個だけです。



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

16.3 言語環境

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Language%20Environments"
"emacs/言語環境"へのコメント(無し)

マルチバイト文字が使用可のときはいつでも、 すべての扱える文字集合をEmacsバッファの中で使えます。 ある言語の文字を表示するために、 Emacsバッファでその言語を選択する必要はありません。 しかし、さまざまなデフォルトを設定するために言語環境を 選択しておくことは重要です。 言語環境は、言語の選択というより、 (多かれ少なかれ)実際には好みの文字を表します。

言語環境は、テキストを読み込むときにどのコーディングシステムを認識するかを 制御します(see 節 16.8 コーディングシステムの認識)。 言語環境は、ファイル、到着メイル、ニュース、 Emacsへ読み込むその他のテキストに適用されます。 言語環境は、ファイルを作成したときに使うデフォルトの コーディングシステムを指定することもあります。 各言語環境は、デフォルトの入力方式も指定します。

言語環境を選択するには、 コマンドM-x set-language-environmentを使います。 このコマンドを使ったときにどのバッファが カレントバッファであるかは関係ありません。 というのは、その効力は、そのEmacsセッションに全体に適用されるからです。 以下の言語環境を使えます。

Chinese-BIG5、Chinese-CNS、Chinese-GB、Cyrillic-Alternativnyj、 Cyrillic-ISO、Cyrillic-KOI8、Devanagari、English、Ethiopic、Greek、 Hebrew、Japanese、Korean、Lao、Latin-1、Latin-2、Latin-3、Latin-4、 Latin-5、Thai、Tibetan、Vietnamese。

いくつかのオペレーティングシステムでは、 ローケル(locale)環境変数を設定することで言語を指定できます。 Emacsは、このよくある特別な場面を扱います。 文字種を表すローケル名が文字列`8859-n'を含むなら、 Emacsは自動的に対応する言語環境を選択します。

ある言語環境lang-envの効果についての情報を表示するには、 コマンドC-h L lang-env RETdescribe-language-environment)を使います。 このコマンドは、その言語環境がどの言語に役立つのか、 その言語で使われる文字集合、コーディングシステム、 入力方式の一覧を表示します。 また、その言語環境で使われる文字を例示する例文も表示します。 デフォルトでは、このコマンドは選択されている言語環境を記述します。

どの言語環境もノーマルフックset-language-environment-hookで カスタマイズできます。 コマンドset-language-environmentは、 新しい言語環境を設定したあとでこのフックを実行します。 フック関数では、変数current-language-environmentを検査すれば、 言語環境を知ることができます。

set-language-environmentは、新しい言語環境を設定し始めるまえに、 まずフックexit-language-environment-hookを実行します。 このフックは、(直前の言語環境を設定した) set-language-environmentで施したカスタマイズをもとに戻すのに便利です。 たとえば、set-language-environment-hookを使って設定した 特定の言語環境で特別なキーバインディングを定義したときには、 それをそのキーのもとのバインディングに戻すために exit-language-environment-hookを設定するべきです。



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

16.4 入力方式

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

入力方式(input method)は、 対話的に入力するために特別に設計された文字変換の一種です。 Emacsでは、典型的には、各言語向けに専用の入力方式があります。 ときには、同じ文字を使ういくつかの言語で入力方式を共有します。 複数の入力方式を使う言語も少しはあります。

入力方式のもっとも単純なものは、ASCII文字を別のアルファベットに 対応させることで動作します。 ギリシア語とロシア語の入力方式はこのように動作します。

より強力な方法は合成で、文字の列を1つの文字に変換します。 多くのヨーロッパの入力方式は、文字のうしろにアクセント文字が続く列 (あるいはその逆順)から、1つの非ASCII文字を生成する合成を使います。 たとえば、いくつかの入力方式では、 文字の列a'を1つのアクセント付き文字に変換します。 これらの入力方式には、その方式に固有の特別なコマンドはありません。 印字文字の列を合成するだけです。

音節文字用の入力方式では、典型的には、対応付けたあとで合成します。 タイ語と韓国語の入力方式は、この方法で動作します。 まず、文字を音声記号に対応付けます。 そして、1つの音節全体を構成するそれらの列を1つの音節記号に対応付けます。

中国語や日本語では、より複雑な方法が必要です。 中国語の入力方式では、まず、中国語の単語の発音表記を入力する (とりわけ入力方式chinese-py)か、 1文字の各部分部分の列(とりわけ入力方式chinese-4cornerchinese-sw)を入力します。 1つの発音表記は、普通、多くの異なる中国語の文字に対応しているので、 特別なEmacsコマンドを使って候補群から1つを選ぶ必要があります。 C-fC-bC-nC-pと数字キーは、 この状況で候補を選ぶために使われる特別な定義になっています。 TABは、すべての候補をバッファに表示します。

日本語の入力方式(19) では、まず、発音表記を使って1つの単語全体を入力します。 そして、単語がバッファに入ったあとで、 Emacsは大きな辞書を使って1つ以上の文字へ変換します。 1つの発音表記は、たくさんの異なる日本語の単語に対応しているので、 その中から選ぶ必要があります。 候補を巡回するには、C-nC-pを使います。

ときには、入力方式での処理を切り離したほうが便利なことがあります。 そうすれば、入力した文字は後続の入力文字と結合されません。 たとえば、入力方式latin-1-postfixでは、 キー列e 'は結合されてアクセント付き`e'になります。 これらを別々の文字として入力したいときはどうするのでしょう?

1つの方法は、アクセントを2回打つことです。 これは、アルファベットとアクセントを別々に入力する特別な機能です。 たとえば、e ' 'は、2つの文字`e''になります。 別の方法は、eのあとに結合されない別の文字を打ってから、 すぐにそれを消すことです。 たとえば、 `e'と`''を入力するには、e e DEL'と打ちます。

別の方法はより一般的ですが、打つのは簡単ではありません。 2つの文字のあいだでC-\ C-\を打って、結合を止めます。 これは、コマンドC-\toggle-input-method)を2回使っています。 See 節 16.5 入力方式の選択

C-\ C-\は、インクリメンタルサーチの中では特に便利です。 というのは、結合する文字を待つことを止めて、 すでに入力したものを探索し始めるからです。

変数input-method-highlight-flaginput-method-verbose-flagは、 入力方式に何が進行中かをどのように表示させるかを制御します。 input-method-highlight-flagnil以外ならば、 バッファでは(入力途中の)部分列を強調表示します。 input-method-verbose-flagnil以外ならば、 (ミニバッファの中でなければ) つぎに打鍵できる文字の一覧をエコー領域に表示します。



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

16.5 入力方式の選択

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

C-\
選択されている入力方式をオン/オフする。

C-x RET C-\ method RET
カレントバッファに対して新しい入力方式を選択する。

C-h I method RET
C-h C-\ method RET
入力方式methodについて説明する(describe-input-method)。 デフォルトでは、(あれば)現在の入力方式を説明する。 この説明で、ある入力方式の使い方の詳細がわかるはず。

M-x list-input-methods
使用可能なすべての入力方式の一覧を表示する。

カレントバッファに対する入力方式を選ぶには、 C-x RET C-\set-input-method)を使います。 このコマンドは、ミニバッファで入力方式名を読みます。 その名前は、通常、一緒に使うことを意図された言語環境で始まります。 変数current-input-methodは、どの入力方式を選択したかを記録します。 入力方式は、非ASCII文字を入力するために、さまざまなASCII文字の列を使います。 ときには、一時的に入力方式をオフにできると便利なこともあります。 そうするには、C-\toggle-input-method)と打ちます。 入力方式をふたたびオンにするには、C-\をもう一度打ちます。

C-\を打ったときに、入力方式をまだ選択していないと、 入力方式を指定するように聞いてきます。 これは、入力方式を指定するために C-x RET C-\を使うのと同じ効果があります。

言語環境を選択すると、さまざまなバッファで使う デフォルトの入力方式を指定します。 デフォルトの入力方式を指定してあれば、 C-\と打てばカレントバッファでそれを選択できます。 変数default-input-methodは、デフォルトの入力方式を指定します (nilは入力方式なしの意味)。

アルファベット文字に対するいくつかの入力方式は、 その文字向けに一般的に使用されるさまざまなキーボード配列を エミュレートするようにキーボードを (実質的に)マッピングし直すことで動作します。 マッピングし直す方法は、あなたの実際のキーボード配列に依存します。 使っているキーボード配列を指定するには、 コマンドM-x quail-set-keyboard-layoutを使います。

使用可能なすべての入力方式の一覧を表示するには、 M-x list-input-methodsと打ちます。 この一覧には、モード行に表示される入力方式を表す文字列を含めて、 各入力方式についての情報が示されます。



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

16.6 ユニバイトとマルチバイトの非ASCII文字

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Multibyte%20Conversion"
"emacs/ユニバイトとマルチバイトの非ASCII文字"へのコメント(無し)

マルチバイト文字が使用可のときには、 文字コード0240(8進数)から0377(8進数)の文字は、 実際にそのままではバッファ内に存在しません。 正しい非ASCII印字文字は、0400から始まるコードになります。

0240から0377の不正な範囲の自己挿入文字を打った場合、 Emacsは、ISO Latin-n文字集合の1つを使おうとしていると仮定して、 Latin-nの文字を表すEmacsのコードに変換します。 言語環境の選択を介して、どのISO Latin文字集合を使うのか指定できます (see 節 16.3 言語環境)。 何も選んでないと、デフォルトはLatin-1です。

C-qでこの範囲の8進コードを入力すると、同じことが起こります。



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

16.7 コーディングシステム

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

さまざまな言語を使うユーザーは、 それらを表現するための標準的な コーディングシステムを数多く確立してきました。 Emacsはこれらのコーディングシステムを内部的には使用しません。 そのかわり、データを読むときには、 さまざまなコーディングシステムからEmacs独自のコーディングシステムに変換し、 データを書くときには、 内部コーディングシステムから他のコーディングシステムに変換します。 ファイルの読み書き、端末とのやりとり、サブプロセスとのデータ交換において、 変換できます。

Emacsは各コーディングシステムに名前を付けています。 多くのコーディングシステムは、1つの言語で使用されるので、 コーディングシステムの名前は、言語の名前で始まります。 いくつかのコーディングシステムは、いくつもの言語で使用されます。 その場合、コーディングシステムの名前は、通常、`iso'で始まります。 印字文字をまったく変換しない特別なコーディングシステム、 no-conversionraw-textemacs-muleもあります。

非ASCII文字のさまざまな表現形の変換に加えて、 コーディングシステムは行末変換も行います。 Emacsは、ファイル内の行の区切り方として、 3つの異なる変換を扱えます。 つまり、改行、復帰改行、復帰です。

C-h C coding RET
コーディングシステムcodingを説明する。

C-h C RET
現在使用しているコーディングシステムを説明する。

M-x list-coding-systems
使用可能なすべてのコーディングシステムの一覧を表示する。

コマンドC-h Cdescribe-coding-system)は、 特定のコーディングシステムについての情報を表示します。 引数にコーディングシステム名を指定できます。 あるいは、引数が空のときには、 カレントバッファに対するものとデフォルトの両方について、 さまざまな目的のために選択されている現在のコーディングシステムと、 コーディングシステムを認識するための優先順位表を説明します。 (see 節 16.8 コーディングシステムの認識)。

利用可能なすべてのコーディングシステムの一覧を表示するには、 M-x list-coding-systemsと打ちます。 モード行に表示される文字を含めて、 各コーディングシステムについての情報の一覧を表示します(see 節 1.3 モード行)。

いかなる種類の変換も行わないno-conversionを除いて、 この一覧に現れる各コーディングシステムは 印字文字をどのように変換する/しないを指定します。 しかし、行末変換は、各ファイルの内容に基づいて決定されます。 たとえば、ファイルが行区切りに復帰改行を使用しているように思われるときには、 その行末変換を使います。

一覧の各コーディングシステムには、 どのように行末変換するかを正確に指定する3つの変種があります。

...-unix
行末変換を行わない。 ファイルでは、行区切りに改行を使用していると仮定する。 (これは、UNIXとGNUシステムで普通に使用される変換。)

...-dos
ファイルでは、行区切りに復帰改行を使用していると仮定し、適当な変換を行う。 (これは、Microsoftシステムで普通に使用される変換。 (20)

...-mac
ファイルでは、行区切りに復帰を使用していると仮定し、適当な変換を行う。 (これは、Machintoshシステムで普通に使用される変換。)

これらのコーディングシステムの変種は、 完全に予想できるのでlist-coding-systemsの表示からは 簡潔にするために除かれています。 たとえば、コーディングシステムiso-latin-1には、 iso-latin-1-unixiso-latin-1-dosiso-latin-1-mac の変種があります。

コーディングシステムraw-textは、 主にASCIIテキストのファイルに適していますが、 ファイルには、非ASCII文字の符号を意味しない127を越えるバイト値が 含まれるかもしれません。 raw-textでは、 Emacsは、それらのバイトが適切に解釈されるように値を変更しないでコピーし、 カレントバッファの enable-multibyte-charactersnilを設定します。 raw-textは、出会ったデータに基づく普通の方法で行末変換を処理し、 使用する行末変換を指定する3つの変種を持ちます。

対照的に、コーディングシステムno-conversionは、 非ASCIIバイト値と行末に対して、いかなる文字コード変換も指定しません。 これは、バイナリファイル、tarファイル、 そのまま処理する必要があるその他のファイルを読み書きするのに便利です。 これも、enable-multibyte-charactersnilを設定します。

いかなる種類の変換もしないでファイルを編集するもっとも簡単な方法は、 M-x find-file-literallyコマンドを使うことです。 このコマンドは、no-conversionを使い、 あなたがファイルを見るまえにファイルの内容を 変換するかもしれないEmacsのその他の機能を抑制します。 See 節 12.2 ファイルを訪問する

コーディングシステムemacs-muleは、 Emacs内部の符号化のままで格納された非ASCII文字を 含むファイルであることを意味します。 これは、出会ったデータに基づいて行末変換を扱い、 行末変換の種類を指定する通常の3つの変種を持ちます。



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

16.8 コーディングシステムの認識

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

一度自分の好みを指定しておけば、ほとんどの場合、Emacsは、 与えられたファイルに対してどのコーディングシステムを使うか認識できます。

いくつかのコーディングシステムは、 データ内にどのようなバイト列が現れたかで、認識したり区別できます。 しかし、区別できないコーディングシステムや その可能性もないコーディングシステムもあります。 たとえば、Latin-1とLatin-2を区別する方法はありません。 これらは同じバイト値を異なる意味で使用しています。

Emacsは、コーディングシステムの優先順位表を用いてこの事態を処理します。 使用するコーディングシステムを指定しなければ、 Emacsはファイルを読むときはいつでも、 優先順位のもっとも高いものから始めて順に下りながら、 データに合うコーディングシステムをみつけるまで 各コーディングシステムに対してデータを検査します。 そして、ファイルはそのコーディングシステムで表現されていると仮定して、 ファイルの内容を変換します。

コーディングシステムの優先順位表は、選択されている言語環境に依存します (see 節 16.3 言語環境)。 たとえば、フランス語を使うのなら、たぶん、 EmacsにはLatin-2よりLatin-1を選んでほしいでしょう。 チェコ語を使うなら、たぶん、Latin-2のほうがよいでしょう。 これが、言語環境を指定する理由の1つです。

しかし、コマンドM-x prefer-coding-systemを使って、 優先順位表の詳細を変更できます。 このコマンドはミニバッファからコーディングシステムの名前を読み、 それを優先順位表の先頭に追加して、他のすべてのものより優先するようにします。 このコマンドを数回使うと、 使用するごとに優先順位表の先頭に1つの要素が追加されます。

iso-8859-1-dosのような行末変換を指定したコーディングシステムを使うと、 iso-8859-1を優先して認識し、その場合にはDOSの行末変換を使うことを Emacsに指示することになります。

ときには、ファイルに対して使用するコーディングシステムを ファイル名が示していることがあります。 変数file-coding-system-alistは、この対応関係を指定します。 このリストに要素を追加する特別な関数 modify-coding-system-alistがあります。 たとえば、すべての`.txt'の読み書きに、 コーディングシステムchina-iso-8bitを使用したいなら、 つぎのLisp式を実行します。

 
(modify-coding-system-alist 'file "\\.txt\\'" 'china-iso-8bit)

始めの引数はfile、 第2引数はこれを適用するファイルを決定する正規表現、 第3引数はこれらのファイルに対して使用するコーディングシステムです。

Emacsは、ファイルの内容に基づいて、使用する行末変換の種類を認識します。 復帰のみ、あるいは、復帰改行の列のみであれば、 対応する行末変換を選択します。 変数inhibit-eol-conversionnil以外を設定すると、 行末変換の自動的な使用を禁止できます。

ファイルの先頭の`-*-...-*-'や、 ファイルの最後のローカル変数リストを使って、 個々のファイルに対してコーディングシステムを指定できます (see 節 28.2.5 ファイルにローカルな変数)。 これを行うには、codingという名前の『変数』に値を定義します。 Emacsには、変数codingは実際にはありません。 変数を設定するかわりに、 ファイルに対して指定されたコーディングシステムを使います。 たとえば、`-*-mode: C; coding: latin-1;-*-'は、 Cモードを指定するとともに、Latin-1のコーディングシステムの使用を指定します。 ファイルでコーディングシステムを明示的に指定した場合、 それはfile-coding-system-alistに優先します。

変数auto-coding-alistは、特定のパターンのファイル名に対して コーディングシステムを指定するもっとも強い方法です。 この変数は、ファイル自身の`-*-coding:-*-'にさえも優先します。 Emacsはtarファイルやアーカイブファイルに対してこの機能を使います。 アーカイブ内のファイルの中にある`-*-coding:-*-'で混乱して、 ファイル全体にコーディングシステムを適用してしまうことを防ぐのです。

Emacsがバッファに対するコーディングシステムを一度選択すると、 そのコーディングシステムをbuffer-file-coding-systemに入れておき、 このバッファからファイルに書く操作では、 デフォルトでこのコーディングシステムを使います。 これには、コマンドsave-bufferwrite-regionも含まれます。 異なるコーディングシステムを用いてこのバッファからファイルに書きたいときには、 set-buffer-file-coding-systemを使って、 そのバッファに対して異なるコーディングシステムを指定します (see 節 16.9 コーディングシステムの指定)。

メイル(mail)モード(see 節 24. メイルの送信)でメッセージを送るとき、 Emacsには、メッセージテキストの符号化に使うコーディングシステムを決定する 異なる方法が4つあります。 バッファのbuffer-file-coding-systemnil以外ならば、 その値を試します。 さもなければ、sendmail-coding-systemの値がnil以外ならば、 その値を使います。 3つめの方法は、新しいファイルに対するデフォルトの コーディングシステムがnil以外ならば、それを使います。 この値は、言語環境の選択で制御されます。 これらの3つの値がすべてnilならば、 Emacsは、Latin-1のコーディングシステムを使用して送出メイルを符号化します。

rmailで新しいメイルを受けとったとき、 各メッセージが別々のファイルであるかのように、 各メッセージは自動的にそのメイルが書かれたコーディングシステムで変換されます。 これには、指定したコーディングシステムの優先順位表を使います。 MIMEメッセージが文字集合を指定するときには、 rmail-decode-mime-charsetnilでない限り、 rmailはその指定に従います。

rmailファイル自身を読んだり保存したりするときには、 Emacsは、変数rmail-file-coding-systemで指定された コーディングシステムを使います。 そのデフォルト値は、nilです。 rmailファイルは変換しないという意味です (rmailファイルは、Emacsの内部文字コードで読み書きされる。)



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

16.9 コーディングシステムの指定

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

Emacsが自動的に正しいコーディングシステムを選択しない場合には、 コーディングシステムを指定するつぎのコマンドを使用できます。

C-x RET f coding RET
カレントバッファに訪問したファイルに コーディングシステムcodingを使う。

C-x RET c coding RET
このコマンドの直後に続くコマンドに対して コーディングシステムcodingを指定する。

C-x RET k coding RET
キーボード入力に対してコーディングシステムcodingを使用する。

C-x RET t coding RET
端末出力に対してコーディングシステムcodingを使用する。

C-x RET p input-coding RET output-coding RET
カレントバッファでのサブプロセスの入力と出力に コーディングシステムinput-codingoutput-codingを使用する。

C-x RET x coding RET
ウィンドウシステムを介した他のプログラムとのセレクションの交換には、 コーディングシステムcodingを使用する。

C-x RET X coding RET
ウィンドウシステムで1つのセレクションの交換には、 コーディングシステムcodingを使用する。

コマンドC-x RET fset-buffer-file-coding-system)は カレントバッファに対してファイルコーディングシステムを指定します。 いいかえれば、訪問したファイルを保存したりふたたび読む込むときに 使うコーディングシステムです。 コーディングシステムはミニバッファを使って指定します。 このコマンドは、すでに訪問したファイルに作用するので、 ファイルを保存するときにしか影響しません。

ファイルに対するコーディングシステムを指定する別の方法は、 ファイルを訪問するときです。 まずコマンドC-x RET cuniversal-coding-system-argument)を使います。 このコマンドは、ミニバッファを使ってコーディングシステム名を読みます。 ミニバッファを出たあと、 直後のコマンドに対して指定したコーディングシステムが使用されます。

ですから、たとえば、その直後のコマンドがC-x C-fならば、 そのコーディングシステムを使ってファイルを読みます (そして、ファイルを保存するときのために そのコーディングシステムを記録します)。 あるいは、その直後のコマンドがC-x C-wならば、 そのコーディングシステムを使ってファイルに書きます。 コーディングシステムを指定することで、影響される他のファイルコマンドは、 C-x C-iC-x C-v、および、 別のウィンドウを使うC-x C-fの変形です。

C-x RET cは、M-x shell(see 節 27.14 Emacsからシェルコマンドを実行する)を含む サブプロセスを開始するコマンドにも影響します。

しかしながら、その直後のコマンドがコーディングシステムを使用しないなら、 C-x RET cは最終的には何の効果もありません。

ファイルを変換しないで訪問するもっとも簡単な方法は、 M-x find-file-literallyコマンドです。 See 節 12.2 ファイルを訪問する

変数default-buffer-file-coding-systemは、 新しいファイルを作成するときのコーディングシステムの選択を指定します。 この変数は、新規作成のファイルを訪問するとき、あるいは、 バッファを作成してそれをファイルに保存するときに適用されます。 言語環境を選択すると、典型的には、 言語環境に対して最適のデフォルトのコーディングシステムを この変数に設定します。

コマンドC-x RET tset-terminal-coding-system)は 端末出力に対するコーディングシステムを指定します。 端末出力のコーディングシステムを指定すると、 端末へのすべての文字出力はそのコーディングシステムに翻訳されます。

この機能は、特定の言語や文字集合向けに作られたある種の文字端末には便利です。 たとえば、ISO Latin 文字集合の1つを扱えるヨーロッパの端末です。 マルチバイトテキストを使っているときには、 Emacsが端末で実際に扱える文字を知るために、 端末コーディングシステムを指定する必要があります。

Emacsがあなたの端末の正しいコーディングシステムを推測できない限り、 デフォルトでは、端末出力はまったく変換しません。

コマンドC-x RET kset-keyboard-coding-system)は キーボード入力に対するコーディングシステムを指定します。 キーボードから入力した文字コードの変換は、 非ASCII図形文字を送出するキーを有する端末には便利です。 たとえば、いくつかの端末は、ISO Latin-1やその部分集合向けに設計されています。

デフォルトでは、キーボード入力はまったく変換しません。

コーディングシステムを使用してキーボード入力を変換することと、 入力方式の使用には似たところがあります。 どちらも、1つの文字に変換するキーボード入力列を定義しています。 しかしながら、入力方式は人が対話的に使用するのに便利なように設計されていて、 変換される列は典型的にはASCII印字文字の列です。 コーディングシステムは、典型的には非図形文字の列を変換します。

コマンドC-x RET xset-selection-coding-system)は、 選択されたテキストをウィンドウシステムへ送るとき、および、 他のアプリケーションで作られたセレクションのテキストを受け取るときの コーディングシステムを指定します。 このコマンドは、再設定しない限り、以降のすべてのセレクションに作用します。 コマンドC-x RET Xset-next-selection-coding-system)は、 Emacsが作る/読むつぎのセレクションのコーディングシステムを指定します。

コマンドC-x RET pset-buffer-process-coding-system)は、 サブプロセスの入出力に対するコーディングシステムを指定します。 このコマンドはカレントバッファに作用します。 通常、各サブプロセスはそれ自身のバッファを持ちます。 ですから、各サブプロセスの入出力の変換を指定するには、 対応するバッファでこのコマンドを使用します。

デフォルトでは、プロセスの入出力はまったく変換しません。

変数file-name-coding-systemは、 ファイル名を符号化するためのコーディングシステムを指定します。 この変数に(Lispシンボルや文字列で)コーディングシステム名を設定すると、 Emacsは、すべてのファイル操作に対してそのコーディングシステムを 使ってファイル名を符号化します。 これは、ファイル名に非ASCII文字を使うことを可能にしています。 あるいは、少なくとも、指定したコーディングシステムで符号化できる 非ASCII文字を使えるはずです。

file-name-coding-systemnilならば、 Emacsは、選択されている言語環境で決まるデフォルトのコーディングシステムを 使います。 デフォルトの言語環境では、 ファイル名の中の非ASCII文字は特別に符号化しません。 Emacsの内部表現でファイルシステム上に現れます。

警告: Emacsセッションの途中でfile-name-coding-system (や言語環境)を変更すると、問題となる場合があります。 つまり、それまでのコーディングシステムで符号化された名前のファイルを すでに訪問していて、新しいコーディングシステムではその名前を 符号化できない(あるいは異なって符号化される)ときです。 そのようなバッファを訪問先ファイル名で保存しようとすると、 まちがった名前のファイルに保存されるか、エラーになります。 そのような問題が発生した場合には、 C-x C-wを使って、 そのバッファに新しいファイル名を指定します。



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

16.10 フォントセット

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Fontsets"
"emacs/フォントセット"へのコメント(無し)

Xウィンドウシステムのフォントは、典型的には、 1つのアルファベットや文字集合の形を定義しています。 したがって、Emacsが扱える文字の範囲全体を表示するには、 たくさんのフォントを集めたものが必要です。 Emacsでは、そういったフォントを集めたものを フォントセット(fontset)と呼びます。 フォントセットは、ある文字コード範囲を扱うフォントのリストで定義されます。

各フォントセットには、フォントと同様に名前があります。 使用可能なXのフォントは、Xサーバーが定義します。 しかし、フォントセットはEmacsの中で定義されます。 いったんフォントセットを定義すれば、フォントを使える場面ではどこでも、 その名前を指定してEmacs内のフォントセットを使用できます。 もちろん、Emacsのフォントセットでは、Xサーバーで使えるフォントだけを使えます。 ある文字が画面で中抜きの箱で表示されたなら、 その文字に使用したフォントセットには、 その文字に対するフォントがないことを意味します。

Emacsは、標準フォントセットスタートアップフォントセットの 2つのフォントセットを自動的に作ります。 標準フォントセットは、非ASCII文字向けの広い範囲のフォントを もっとも持ちそうなものです。 しかし、これは、Emacsが使うデフォルトではありません。 (デフォルトでは、 Emacsはボールドとイタリックの変種のフォントをみつけようとする。) オプション`-fn'やXのリソース`Font'(see 節 A.7 フォント指定オプション)で 使用する標準フォントセットを指定できます。 たとえば、つぎのようにします。

 
emacs -fn fontset-standard

フォントセットが、すべての文字コードに対するフォントを 指定する必要はありません。 フォントセットが、ある文字に対してフォントを指定していない、あるいは、 システムに存在しないフォントを指定している場合には、 その文字を正しく表示できません。 そのかわりに、中抜きの箱を表示します。

フォントセットの高さと幅は、ASCII文字で決定されます (つまり、そのフォントセット内でASCII文字用に使われるフォント)。 フォントセットのあるフォントが異なる高さや幅を持つ場合には、 そのフォントを割り当てられた文字は、 フォントセットの大きさに切り詰められます。 highlight-wrong-size-fontnil以外ならば、 これらのまちがった大きさの文字は箱で囲まれて表示されます。



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

16.11 フォントセットの定義方法

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Defining%20Fontsets"
"emacs/フォントセットの定義方法"へのコメント(無し)

Emacsはstandard-fontset-specの値に従って、 自動的に標準フォントセットを作ります。 フォントセットの名前はつぎのとおりです。

 
-*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard

または、省略して`fontset-standard'です。

標準フォントセットのボールド、イタリック、ボールドイタリックの変種も 自動的に作られます。 それらの名前は、`medium'のかわりに`bold'、 `r'のかわりに`i'、あるいは、両方ともそのようになります。

リソース`Font'やオプション`-fn'で、 デフォルトのASCIIフォントを指定すると、 Emacsはそれから自動的にフォントセットを生成します。 これが、スタートアップフォントセットで、 その名前はfontset-startupです。 これは、フォント名のフィールド、foundryfamilyadd_styleaverage_widthを`*'で、 charset_registryを`fontset'で、 charset_encodingを`startup'で置き換えて得られた文字列を フォントセットの指定に使用します。

たとえば、Emacsをつぎのように起動します。

 
emacs -fn "*courier-medium-r-normal--14-140-*-iso8859-1"

Emacsがつぎのフォントセットを生成して、 Xウィンドウの初期フレームに使います。

 
-*-*-medium-r-normal-*-14-140-*-*-*-*-fontset-startup

Xのリソース`Emacs.Font'で、 フォントセット名を実際のフォント名のように指定できます。 しかし、`Emacs*Font'のようなワイルドカードを使ったリソースに フォントセット名を指定しないように注意してください。 ワイルドカードを使った指定は、フォントセットを扱えないメニューのような、 他のさまざまな目的にも適用されます。

`Fontset-n'という名前のXのリソースを 使って追加フォントセットを指定できます。 ただし、nは0から始まる整数です。 リソースの値はつぎのような形式でなければなりません。

 
fontpattern, [charsetname:fontname]...

fontpatternは、最後の2つのフィールドを除いて、 標準のXフォント名の形式でなければなりません。 最後の2つのフィールドは、`fontset-alias'の形式を持つべきです。

フォントセットには2つの名前、長い名前と短い名前があります。 長い名前はfontpatternです。 短い名前は`fontset-alias'です。 どちらの名前でもフォントセットを参照できます。

`charset:font'という構成は、 ある文字集合に対して(このフォントセットでは) どのフォントを使用するかを指定します。 ここでcharsetは、文字集合の名前で、 fontはその文字集合に使用するフォントです。 1つのフォントセットの定義の中では、この構成を何度でも使用できます。

他の文字集合に対しては、Emacsはfontpatternに基づいて選択します。 これには、文字集合を記述する値で`fontset-alias'を置き換えます。 ASCII文字フォントに対しては、`fontset-alias'を `ISO8859-1'で置き換えます

これに加えて、いくつか連続したフィールドがワイルドカードであるなら、 Emacsはそれらを1つのワイルドカードにまとめます。 これは、自動的に拡大縮小したフォントの使用を避けるためです。 大きめのフォントを縮小したフォントは編集には使えません。 また、小さめのフォントを拡大したフォントも便利ではありません。 というのは、Emacsがそうするように、 もともと小さなフォントを使うほうがよいからです。

したがって、fontpatternがつぎのようであると、

 
-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24

ASCII文字に対するフォント指定はつぎのようになります。

 
-*-fixed-medium-r-normal-*-24-*-ISO8859-1

また、Chinese GB2312文字に対するフォント指定はつぎのようになります。

 
-*-fixed-medium-r-normal-*-24-*-gb2312*-*

上のフォント指定に一致する中国語フォントがないかもしれません。 多くのXの配布には、familyフィールドが `song ti'か`fangsong ti'の中国語フォントだけが含まれています。 そういった場合、`Fontset-n'をつぎのように指定します。

 
Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\
        chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*

そうすると、Chinese GB2312の文字を除くフォント指定では familyフィールドが`fixed'となり、 Chinese GB2312の文字に対するフォント指定では familyフィールドが`*'となります。

フォントセットのリソース値を処理してフォントセットを作る関数は、 create-fontset-from-fontset-specです。 フォントセットを作るために、この関数を明示的に呼ぶこともできます。

Xにおけるフォントの命名法について詳しくは、See 節 A.7 フォント指定オプション



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

16.12 1バイトヨーロッパ文字の使い方

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=emacs&node=Single-Byte%20European%20Support"
"emacs/1バイトヨーロッパ文字の使い方"へのコメント(無し)

ISO 8859 Latin-n文字集合は、 さまざまなヨーロッパの言語で必要とされるアクセント文字と句読点記号を 扱うために、160から250の範囲の文字コードを定義しています。 マルチバイト文字を使用不可にしても、 Emacsは、一度にはこれらの文字コードの1つを扱えます。 これらのコードのどれを使うかを指定するには、 M-x set-language-environmentを起動して、 `Latin-n'のような適切な言語環境を指定します。

ユニバイト操作についてより詳しくは、 16.2 マルチバイト文字を使用可能にするを参照してください。 非ASCII文字を含んだ初期化ファイルをユニバイトで読むことを保証したいときには 特に注意してください。

端末や使っているフォントでこれらの文字を扱えるならば、 Emacsはこれらの文字を表示できます。 これは自動的に行われます。 あるいは、ウィンドウシステムを使っている場合には、 現在の言語環境に従ってそれらに対応するマルチバイト文字を表示することで、 Emacsはフォントセットを介して1バイト文字を表示できます。 これを行うには、 変数unibyte-display-via-language-environmentnil以外の 値を設定します。

もし、端末でLatin-1文字集合を表示できなければ、 Emacsは、これらの文字をその文字が少なくとも何であるかを明確に理解できるような ASCII列として表示できます。 これを行うには、ライブラリiso-asciiをロードします。 他のLatin-n文字集合に対しても似たようなライブラリを実装できますが、 まだ行っていません。

(文字128から159の)非ISO 8859文字は、通常、8進表示されます。 ライブラリdisp-tableの関数standard-display-8bitを使えば、 この表示を非標準の「拡張」版のISO 8859文字集合に変更できます。

1バイト非ASCII文字を入力する異なる方法が3つあります。


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