The Unicode HOWTO: ロケール設定

次のページ 前のページ 目次へ

## 4. ロケール設定

## 4.1 ファイルとカーネル

すでに、どのような Unicode 文字でもファイル名として使えるようになってい ます。カーネルやファイルユーティリティの修正は必要ありません。カーネル内 でのファイル名はヌル文字や / を含まない限り何でもかまいません(/ はサブディ レクトリの区切りに使われているからです)。UTF-8 を使用してエンコードされ る時に、非 ASCII 文字がヌル文字や / にエンコードされることはありません。 ファイルやディレクトリの名前が文字数よりも多くのバイト数を占めるだけです。 例えば 5 つのギリシャ文字からなるファイル名はカーネルからは 10 バイトの ファイル名として見えます。カーネルはこれらがギリシャ文字で表示されるとい うことを知りませんし、知る必要もありません。

これが基本原理です。ファイルが Linux だけで使われるのであれば。他の OS から使用されるファイルシステムのためには、ファイル名を UTF-8 と相互にコ ンバートするマウントオプションがあります。

- "vfat" ファイルシステムにはマウントオプション "utf8" があります。 file:/usr/src/linux/Documentation/filesystems/vfat.txt を見てく ださい。デフォルト("iso8859-1" です)ではなく "iocharset" マウントオプショ ンを指定した場合には "utf8"を使用するどうかに関わらず、結果には一貫性が ありません。ですから "iocharset" マウントオプションはお勧めしません。
- "msdos"、"umsdos" ファイルシステムも同じマウントオプションを持っています が、何も起こらないようです。
- "iso9660" ファイルシステムにはマウントオプション "utf8" があります。 file:/usr/src/linux/Documentation/filesystems/isofs.txt を見てく ださい。
- Linux 2.2.x カーネル以降は、"ntfs" ファイルシステムにマウントオプション "utf8" があります。 file:/usr/src/linux/Documentation/filesystems/ntfs.txt を見てください。

他のファイルシステム(nfs, smbfs, ncpfs, hpfs など)ではファイル名をコンバー トしません。つまりそれらの OS がサポートしている時に限り、UTF-8 でエンコー ディングされた Unicode のファイル名をサポートします。あとで再マウントす る時にマウントオプションを有効にするために /etc/fstab の関係する行の 4 番目のカラムにオプションを追加するとよいでしょう。

## 4.2 tty とカーネル

tty は 2 つのプログラム間にあるいわゆる双方向パイプのような物で、文字の エコーやコマンドラインでの編集といった素敵な機能を持っています。xterm で 引数なしの "cat" コマンドを実行すると何行でも入力や編集ができ、また各行 はエコーバック(訳注：入力した文字のエコー表示)されます。カーネルの編集機 能は正常に動作しません。特に、バックスペースキーとタブキーは正しく扱われ ません。

この問題を修正するには、次のようにします。

- 次のうち対応するカーネルパッチをあて、カーネルの再コンパイルをします。
  linux-2.0.35-tty.diff, linux-2.2.9-tty.diff, linux-2.3.12-tty.diff
- glibc2 を使っているのであれば、パッチ glibc211-tty.diff をあてて libc の再コンパイルを行います。冒険が好き でなければ、既にインストールされているインクルードファイルにパッチ glibc-tty.diff をあてるだけで充分です。
- パッチ stty.diffを GNU sh-utils-1.16b にあてて "stty" プログラムの リビルドを行ない、"stty -a" と "stty iutf8" を使ってテストをします。
- "stty iutf8" コマンドを "unicode_start" スクリプトに、 "stty -iutf8" コマンドを "unicode_stop" スクリプトに追加します。
- パッチ xterm.diff を xterm-109 にあてて "xterm" のリビルドを行い、 "xterm - u8" や "xterm +u8" を実行して、そこで "stty -a" や "cat" を動か してテストします。

rlogin や telnet をしてもこの修正を有効にし続けるには次のことを する必要があります：

- 環境変数 TERM に新しい値("linux" へのエイリアスとして "linux-utf8" を、 "xterm" へのエイリアスとして "xterm-utf8")を定義します。システムに ncurses ライブラリと /usr/lib/terminfo(または /usr/share/terminfo) があ る場合には、

  > `

  >     $ tic linux-utf8.terminfo
  >     $ tic xterm-utf8.terminfo

  > `

  を root 以外で実行することによって行います。これは terminfo エントリを $HOME/.terminfo ディレクトリに作ります。ここに linux-utf8.terminfo と xterm-utf8.terminfo があります。この作業を root で行うこと はお勧めしません。実行すると /usr/lib/terminfo に terminfo エントリを作 成してしまいますが、これはシステムをアップグレードした時に消されてしまう かもしれません。システムに /etc/termcap ファイルがある場合には、そのファ イルも編集した方がよいでしょう。linux と xterm エントリをコピーし、それ ぞれに新しい名前 "linux-utf8" と "xterm-utf8" を付けます。例はこの termcap.diff です。
- コンソールから "unicode_start" や "unicode_stop" を呼びだす度に、それ ぞれ "export TERM=linux-utf8" や "export TERM=linux" も実行してください。
- パッチ xterm2.diffを xterm-109 にあてて "xterm" をリビルドし、 /usr/X11R6/lib/X11/app-defaults/XTerm と $HOME/.Xdefaults から全ての "XTerm*termName" 行を取り除きます。これで xterm が UTF-8 モードで実行さ れている時の TERM 変数は "xterm" の代わりに "xterm-utf8" となっています。
- パッチ netkit.diff, netkitb.diff, telnet.diff をあてて "rlogind" と "telnetd" をリビルドします。こ れで rlogin と telnet は TERM 変数が "linux-utf8" や "xterm-utf8" である 時には、いつでも tty を UTF-8 編集モードにすることができます。

## 4.3 一般的なデータ変換

ローカルでのエンコーディング(おそらく ISO-88591 や EUC)がされているテキ ストを UTF-8 にコンバートするプログラムが必要になるはずです。(代替としては 同じマシン上で、それぞれ異なったエンコーディングのテキストを使い続けるこ とですが、これは長期的に見るとあまり楽しいことではありません) そのよ うなプログラムの 1 つに `iconv' があります。これは glibc-2.1 に同梱され ており、次のようにして簡単に使えます。

> `

>     $ iconv --from-code=ISO-8859-1 --to-code=UTF-8 < old_file > new_file

> `

この i2u.sh (ISO を UTF にコンバート) と u2i.sh (UTF を ISO にコンバート)は、便利なスクリプトです。いま利用している 8 ビット 文字セットに合うように修正してください。

glibc-2.1 や iconv がインストールされていなければ、GNU recode 3.5 を代わ りに使用することができます。"i2u" i2u_recode.sh は"recode ISO-8859-1..UTF-8" と、"u2i" u2i_recode.sh は "recode UTF-8..ISO-8859-1" として行います。 ftp://ftp.iro.umontreal.ca/pub/recode/recode-3.5.tar.gz ftp://ftp.gnu.org/pub/gnu/recode/recode-3.5.tar.gz注意： GNU recode 3.5 以上が必要となります。GNU recode 3.5 のコンパイルを glibc2 が 存在しないプラットフォーム(つまり古い Linux システム)で行なうには、-- disable-nls を指定して configure する必要があります。指定しない場合には リンクに失敗します。 CJK をサポートする開発版の新しい GNU recode はここから入手できます。 http://www.iro.umontreal.ca/contrib/recode/

CLISP を代わりに使用することもできます。この "i2u" i2u.lsp と "u2i" u2i.lsp は Lisp で書かれています。注意： CLISP の 1999 年 7 月以 降のバージョンが必要です。 ftp://clisp.cons.org/pub/lisp/clisp/source/clispsrc.tar.gz

GNU record よりも機能が劣りますが、その他のデータコンバートプログラムには `trans' ftp://ftp.informatik.uni-erlangen.de/pub/doc/ISO/charsets/trans113.tar.gz、 Plan9 operating system の `tcs' ftp://ftp.informatik.uni-erlangen.de/pub/doc/ISO/charsets/tcs.tar.gz、 G. Adam Stanislav の作成した `utrans'/`uhtrans'/`hutrans' ftp://ftp.cdrom.com/pub/FreeBSD/distfiles/i18ntools-1.0.tar.gz <adam@whizkidtech.net> があります。

他の文字セットから UTF-8 へのファイルのコンバートをたびたび行なう時には 半自動のツール to-utf8 を 使うことができます。これはファイルの非 ASCII 文字をユーザーに表示し、ファ イルの元の文字セットをユーザーに選択させることによりファイルを UTF-8 にコンバー トすることができます。

## 4.4 ロケールの環境変数

次の環境変数にロケール名などをセットすることができます。

LANGUAGE

  LC_MESSAGES (の設定)を上書きします。GNU gettext だけが使用します。

LC_ALL

  他の LC_* 変数で指定されている全ての設定を上書き(他の設定より この指定が優先)します。

LC_CTYPE, LC_MESSAGES, LC_COLLATE, LC_NUMERIC, LC_MONETARY, LC_TIME

  それぞれ、次の内容を設定する変数です： 文字の種類とエンコーディング、 メッセージ表示に使用する言語、 ソートのルール、 数字の書式、 通貨の書式、 日付と時間の表示

LANG

  全ての LC_* 変数のデフォルト値です。 LC_* を指定しない場合には、LANG の値が適用されます。

(詳細は ``man 7 locale`' を参照してください)

それぞれの LC_* と LANG 変数には、次のような形でロケール名を指定することができます。

> language[_territory[.codeset]][@modifier]

ここで language は ISO 639 language code(小文字)、territory は ISO 3166 country code(大文字)、codeset は文字セットを意味し、modifier はその他の 特別な属性(例えば、方言や標準とは違った綴りなど)を表しています。

LANGUAGE には、複数のロケール名をコロンで区切って指定することができます。

システムやアプリケーションに UTF-8 を使用していると指定するためには、 ロケール名にコードセットのサフィックスとして UTF-8 を追加する必要があります。例えば、

> `

>     LANGUAGE=de:fr:en
>     LC_CTYPE=de_DE

> `

を使用しているのであれば、このように変更します。

> `

>     LANGUAGE=de.UTF-8:fr.UTF-8:en.UTF-8
>     LC_CTYPE=de_DE.UTF-8

> `

## 4.5 ロケールサポートファイルの作成

glibc-2.1、glibc-2.1.1、glibc-2.1.2 のどれかをインストールしている場合に は、まず "localedef --help" を使用して、文字マップのシステムディレ クトリが /usr/share/i18n/charmaps かどうかをチェックします。次に /usr/share/i18n/charmaps/UTF8 ファイルに glibc21.diff, glibc211.diff, glibc212.diff の対応するパッチをあてます。そして、例えばこのよう にして利用する UTF-8 ロケール用のサポートファイルを作成します。

> `

>     $ localedef -v -c -i de_DE -f UTF8 /usr/share/locale/de_DE.UTF-8

> `

通常は country サフィックスなしの "de" や "fr" といったロケールを作成 する必要はありません。これらのロケールは大抵の場合には LANGUAGE 変数から 使われるだけで、LC_* 変数には使われないからです。また、LANGUAGE が使われ るのは LC_MESSAGES の設定を上書きする場合だけです。

## 4.6 C ライブラリにサポートを追加する

glibc-2.2 はマルチバイトのロケール、特に上記で作成された UTF-8 ロケール をサポートします。ですが glibc-2.1 や glibc-2.1.1 は実際にはマルチバイト をサポートしません。つまり上記で作成した /usr/share/locale/de_DE.UTF-8/* ファイルの実際の効果は、`setlocale(LC_ALL,"")' が環境変数の設定により ".UTF-8" サフィックスを取り除かずに "de_DE.UTF-8" を返すだけです。

UTF-8 ロケールのサポートを追加するには `libutf8_plug.so' ライブラリ libutf8-0.6.2.tar.gz をビルドして、インストールします。 そしてインストールされたライブラリを指すように LD_PRELOAD 環境変数をセットします。

> `

>     $ export LD_PRELOAD=/usr/local/lib/libutf8_plug.so

> `

これで、この環境変数がセットされて起動された全てのアプリケーションで libutf8_plug.so の関数が /lib/libc.so.6 のオリジナルのものより優先されます。 LD_PRELOAD に関する詳細は "man 8 ld.so" を参照してください。

ここで述べた全てのことは、glibc-2.2 が出ればもはや必要なくなります。

## 4.7 メッセージカタログのコンバート

さて新しいロケールの中身を埋めましょう。次の /bin/sh コマンドはメッセー ジカタログを UTF-8 フォーマットにコンバートすることができます。これは root で実行する必要があり、また GNU gettext-0.10.35 の `msgfmt' と `msgunfmt' がインストールされている必要があります。 convert-msgcat.sh

これも glibc-2.2 が出ればもはや必要なくなります。その時までには gettext は iconv や librecode を使用して、文字列を適切に元の文字セットからユーザー の文字セットへコンバートするでしょうから。

次のページ 前のページ 目次へ