玩式草子─ソフトウェアとたわむれる日々

第70回 Plamo LinuxをUTF-8で使う[その2]

この記事を読むのに必要な時間:およそ 4 分

前回は日本語を表示するための文字コードについて振り返り,JISに基づくShift-JISやEUC-JPから,Unicodeに基づくUTF-8へと移行してきた流れとそれに伴なって生じた不具合について紹介しました。

実のところEUC-JPやUTF-8は文字と数字を対応づけるためのルールに過ぎず,それをどう利用するかはソフトウェアの側に委ねられています。そこで今回は,これら文字コードを利用するための仕組みであるlocale(ロケール)について簡単に触れた後,実際にPlamo Linuxでロケール回りの設定を変更する方法を紹介しましょう。

ロケール機能とLANG環境変数

元々,コンピュータやソフトウェアは英語圏で発展したので,使う言語は英語しか考えられていませんでした。

printf("Hello World");

しかし,コンピュータやソフトウェアが英語圏以外にも普及していくにつれ,表示されるメッセージを自分たちが使っている言語にしたいという欲求が生じました。メッセージを変更するには,プログラムを改造し,コンパイル時の指定に応じて出力するメッセージを替えることが考えられます。

#ifdef JAPANESE
    printf("今日は,世界");
#else
    printf("Hello World");
#fi

英語と日本語の2言語程度ならこのような対応でも何とかなるでしょうが,世界中には他にもさまざまな言語があり,それらを一々プログラムの中の条件分岐で対応していたら大変です。そこでC言語では,プログラムの処理と表示すべきメッセージを分離して,表示すべきメッセージはプログラム本体とは独立に,指定に応じて変更できるようにしました。

その場合,プログラム本体では文字列そのものではなくmsg_01といった変数を表示するようにします。

printf(msg_01);

このmsg_01に入れるべき文字列は,言語ごとの設定ファイルとして用意します。

English.mo
msg_01:"Hello World"

Japanese.mo
msg_01:"今日は,世界"

Chinese.mo
msg_01:"你好,世界"

Russian.mo
msg_01:"привет мир"

こうしておけばプログラム本体は同じままで,⁠英語で表示せよ(="English.moを使え")⁠と指示すればmsg_01として "Hello World"が,⁠ロシア語で表示せよ」と指示すれば"привет мир"が表示されることになります。

Unix/Linuxの場合,C言語で書かれたソフトウェアは実行時にCライブラリ(libc)を利用するので,このような多言語の切り替え機能はlibcに実装されており,locale(ロケール,あるいはロカール)と呼ばれています。

localeはフランス語由来の「場所」「場面」を意味する単語で,localと同じ語源だそうです。

libc(Linuxの場合はglibc)がどのロケールを利用するか(=どの言語で表示するか)は,コマンドで直接指定することもできるものの,通常はLANGという環境変数経由で設定することになっています。

ロケールやLANG環境変数では,どの言語を使用するかを"言語名_使用地域"の形で指定し,必要に応じて"使用する文字コード"の指定を追加することになっています。

日本語の場合,⁠言語名」は日本語ja)⁠⁠地域名」は日本JPなので"ja_JP"となり,文字コードとしてEUC-JPを使う場合は"ja_JP.eucJP",UTF-8を使う場合は"ja_JP.UTF-8"となります。

すなわち「日本語の文字コードをEUC-JPからUTF-8に変更する」には,"ja_JP.euc-JP"と設定されているLANG環境変数を"ja_JP.UTF-8"に変更すればいい,ということになります。

環境変数の設定方法

Plamo Linuxではコンソールでも日本語が使えるように,カーネルのコンソール用ドライバに"unicon"と呼ばれる機能を追加するパッチをあてています。uniconはfbterm等のアプリを不要にする便利な機能なものの,開発時期が古いこともありUTF-8には対応していません。

そのためLANG環境変数の設定も,⁠ログインした段階ではja_JP.eucJP」⁠⁠Xを起動するとja_JP.UTF-8」という2段階にしておく方が便利でしょう。

Plamo Linuxの場合,デフォルトの状態ではLANG環境変数を/etc/profile~/.bashrc~/.xinitrcの3ヵ所で設定しています。

これらの設定のうち,/etc/profileはログインした際に一度だけ実行される設定で,~/.bashrcはシェル(bash)を起動するごとに実行される設定,~/.xinitrcはX Window Systemを起動する際に実行される設定です。

bash以外のtcshやzshを使っている場合,前2者は各シェル用の設定ファイルに読み替えてください。

/etc/profileは,前述した「ログインした段階ではja_JP.eucJP」を実現する設定になっているのでこのままにしておきます。

一方,⁠Xを起動するとja_JP.UTF-8」という設定は~/.xinitrc に指定することになります。この際,LANG以外にも,OUTPUT_CHARSETJLESSCHARSETという変数にUTF-8を使う指定を追加し,それらをexportしておきます。

 37  # LANG=ja_JP.eucJP
 38  # export LANG
 39  LANG=ja_JP.UTF-8
 40  OUTPUT_CHARSET=UTF-8
 41  JLESSCHARSET=japanese-utf8
 42  export LANG OUTPUT_CHARSET JLESSCHARSET

この例では,元々は37~38行で設定していたLANGをコメントアウトし,新たに39~42行でLANGOUTPUT_CHARSETJLESSCHARSETを設定しています。

40行めのOUTPUT_CHARSETはglibcが各アプリのメッセージカタログを出力する際の文字コード指定,41行めのJLESSCHARSETはlessがファイルを読む際と出力する際の変換の指定です。それぞれの環境変数で指定の仕方が少しずつ違っているのでご注意ください。

本来,LANGを指定すれば40行目のOUTPUT_CHARSETは不要なはずですが,ロケール・データの設定が不十分なのか,指定しないとアプリのメッセージが正しくUTF-8にならないようです。

最後に ~/.bashrcから,これらの設定と重なる部分を削除します。具体的には,29~35行をコメントアウトしてしまえばいいでしょう。

 29  # LANG=ja_JP.eucJP
 30  # export LANG
 31  
 32  # JISで表示できない端末はEUCにする
 33  # if [ "$TERM" = "xterm" -o "$TERM" = "dtterm" ] ; then
 34  #   JLESSCHARSET=japanese-euc
 35  # fi

これらの設定を削除しておかないと,X Window System上でターミナルソフト等を起動すると,そこで動作するbashがLANGやJLESSCHARSETの設定を上書きしてしまいます。

以上の変更を加えた後,いったんログアウトして再度ログインし,X Window Systemを立ちあげると,LANGはja_JP.UTF-8に設定され,前回指摘した文字コードがらみの問題は発生しなくなりました。

図1 VLCが正しくファイル名を読める

図1 VLCが正しくファイル名を読める

なお,今回紹介した方法で文字コードを切り替えて使えるのは,XfceやKDE,Mateといった最近の統合デスクトップ環境のみで,多言語化に対応していないAfterStepClassicやQvwmといった古いウィンドウマネージャはUTF-8環境で利用することはできません。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入