GentooでのUTF-8の使用方法

Thomas Martin  Author
Alexander Simonov  Contributor
Shyam Mani  Editor
中野 正智  翻訳
小林弘樹  翻訳
Taku Murakami  翻訳

更新日 2006年 8月 28日
このドキュメントのオリジナルバージョン の更新日は2009年 8月 11日

1.  文字コード

文字コードとは

コンピュータはテキストそれ自体を理解することができません。 その代わりに、数字を用いてすべての文字を表します。 伝統的に、それぞれのセットで使用できるアルファベットや文字(コーディングシステム、エンコーディングまたはキャラクタセットのこと)の数は、 コンピュータハードウェアの能力により限界がありました。

文字コードの歴史

最も一般的な(少なくとも、最も広く受け入れられている)キャラクタセットはASCII (American Standard Code for Information Interchange)です。 ASCIIが今までで最も成功したソフトウェア標準であるということは、広く支持されていることです。 現在のASCIIは1986年American National Standards Institute(米国規格協会)によって制定されました(ANSI X3.4, RFC 20, ISO/IEC 646:1991, ECMA-6)。

ASCIIは7ビットに制限されています。これは7桁のバイナリで表されるビットパターンを使用するというです。 十進数で言うと、0から127の範囲を使用可能ということになります。 この範囲には、32の目に見えないコントロール文字が含まれています。 大部分が0から31の間に、また最後のコントロール文字は、DELまたはdeleteで、127番目のところににあります。 32から126には、目に見える文字、つまりスペース、句読点、ラテン文字、数字が入ります。

ASCIIの8番目のビットはもともとは、エラーチェックのためのパリティビットとして使われていました。 しかし、これが必要ではない場面では、0としておきます。 これは、ASCIIでは、各文字はシングルバイトで表すことを意味します。

近代の英語で、コミュニケーションをするためにはASCIIで十分でしたが、 他のアクセント記号を含む他のヨーロッパ言語では、ことは簡単に行きませんでした。 ISO 8859規格は、このニーズを満たすために誕生しました。 これはASCIIへの互換性を残したまま、 8番目のビットに空白にしておくのではなく、 それぞれのエンコーディングごとに他の127文字を持たせるために使用しました。 ISO 8859の限界はすぐに露見しましたが、 現在15種類のISO 8859規格(8859-1から8859-15)が存在しています。 これらの文字セットではASCII互換ではない部分で、 しばしば文字の衝突が発生しました。 Windows-1252がマイクロソフトウィンドウズで西ヨーロッパ言語として使用されたことは、 文字エンコード間の透過性をさらに複雑化させることになりました。 これは、ISO 8859-1の上位集合なのですが、いくつかの手法が異なっています。 しかしながら、これらすべてのセットはASCIIとしての互換性は保持されています。

日本語や韓国語(また少ない範囲での中国語)で使用されているEUC(Extended Unix Coding)のような、 ラテン言語ではない文字のシングルバイトエンコーディングの開発はさらなる混乱を生みました。 一方、他のOSでは、それでもやはり同じ言語で違う文字セット(例えばShift-JISとISO-2022-JP)を使用していました。 キリル文字を表示させたいユーザーは、ロシア語やブルガリア語ではKOI8-Rを、 ウクライナ語ではKOI8-U、 または他のキリル文字のエンコード(うまくいっていないISO 8859-5またはWindows-1251セットなど)から選択する必要がありました。 これらのキャラクタセットはASCIIとの互換性を持ちません。 (KOI8エンコーディングはキリル文字をラテンの文字順に格納しますが、 この場合8ビット目は省かれるので、 テキストは大文字小文字が反転した形でASCII端末に表示され判読は可能です。)

これは混乱を起こし、複数言語でのコミュニケーションをほぼ不可能にします。 そしてUnicodeの出番です。

Unicodeとは

Unicodeは、昔ながらの文字セットのシングルバイト制限を取り払います。 そして、Unicodeは65,536コードを持つ17のplaneで、最大1,114,112文字を表現します。 "基本多言語面(Basic Multilingual Plane)"またはBMPとも呼ばれている最初のplaneには、使うであろうすべての文字が含まれているので、 多くの人はUnicodeは16bit文字コードセットだと間違った想定をしてしまいがちです。

Unicodeはたくさんの違った方法で文字が割り当てられています。 その中で、UTF (Unicode Transformation Format)とUCS (Universal Character Set)が最も一般的です。 UTFの後の数字は一単位で何ビットかを表します。 また、UCSの後の数字は、バイト数を表します。 UTF-8は、その8ビットクリーンな特性から、Unicodeで文章のやりとりをする目的では、 最も広まりました。 そして、UTF-8がこのドキュメントの主題です。

UTF-8

UTF-8は、1バイトから4バイトを使用する可変長の文字コードです これが意味するところは、ASCIIとラテン文字についてはわずかなデータ量の増加で相互変換可能だということです。 なぜなら、これらの文字セットでは最初の1バイトしか使われないからです。 日本語のような東洋の言語利用者はより多くのバイトを割り当てられ、あまり幸せではありません。 結果として、最大50%のデータ冗長性が発生するからです。

UTF-8でできること

UTF-8は、標準的で国際的に受け入れられた多言語対応環境を比較的データの冗長をおさえて提供します。 また、UTF-8はインターネット上で、メール、IRC、その他多くのメディアを通じて、ASCII以外の文字を送信する際に好まれています。 この一方で、多くの人々はネットワークコミュニケーションにおいて、UTF-8には弊害があると考えています。 ASCII以外のUTF-8を使用する前には、必ずそのメーリングリストやUsenetでのUTF-8の扱いを意識してください。

2.  Gentoo LinuxでのUTF-8のセットアップ

UTF-8ロケールの発見、または作成

ここまでで、Unicodeの背景にある理念を説明してきました。 さて、次にUTF-8を使い始める準備をします。

UTF-8を使用するためには事前に、国際化言語サポートされたglibcがインストールされている必要があります。 この作業を行うにあたり、推奨される方法が/etc/locale.genファイルです。 このファイルの使用方法を説明するのは、このドキュメントの範疇を越えてしまいますが、 Gentoo Localization Guide(日本語訳)で説明がされています。

次に、どのUTF-8ロケールを使用するか、または新しく作成する必要があるのかを判断する必要があります。

コード表示 2.1: 既存のUTF-8ロケールを調べる

("en_GB"はあなたの望ましいロケールに置換してください。訳注:日本語ならja_JPでいいでしょう)
# locale -a | grep 'en_GB'
en_GB
en_GB.UTF-8

このコマンドの出力結果から、.UTF-8のような拡張子のついたファイルがあるかどうか確認します。 もし.UTF-8のような出力が得られなかった場合には、UTF-8互換のロケールを作成する必要があります。

注意: もしあなたの言語用にUTF-8ロケールが存在しなかった場合には下記コマンドを実行します。

コード表示 2.2: UTF-8ロケールの作成

("en_GB"をあなたの望むロケールに変更してください)
# localedef -i en_GB -f UTF-8 en_GB.UTF-8

またUTF-8ロケールをインストールする他の方法として、/etc/locale.genファイルにロケールを追加し、 locale-genコマンドで必要なロケールを再生成する方法があります。

コード表示 2.3: /etc/locale.genの該当行

en_GB.UTF-8 UTF-8

ロケールの指定

UTF-8ロケールを使用するためには、LC_ALL(これはLANG設定を上書きします)の一つの環境変数を設定する必要があります。 この値をセットする方法は色々ありますが、特定のユーザーにだけUTF-8環境変数を適用したい場合には、それらのユーザーの~/.profile(/bin/shを使用している場合)、~/.bash_profileまたは~/.bashrc (/bin/bashを使用している場合)にセットします。

またはシステム全体にセットしたい場合もあります。 筆者が特に推奨する一つの方法は、/etc/init.d/xdmの中で設定する方法です。 なぜならこの初期起動スクリプトは、上述のスクリプトを読み込む前、 つまり環境変数が設定される前にディスプレイマネージャーとデスクトップを起動するからです。

ロケールをグローバルに設定するには/etc/env.d/02localeを使用するべきです。 このファイルは、次のようになります。

コード表示 2.4: /etc/env.d/02localeの例

("en_GB.UTF-8"をあなたのロケールに変更してください。) 
LC_ALL="en_GB.UTF-8"

次にこの変更を使用して環境を更新します。

コード表示 2.5: 環境の更新

# env-update
>>> Regenerating /etc/ld.so.cache...
 * Caching service dependencies ...
# source /etc/profile

では、localeコマンドを引数なしで実行し、環境変数に正しく設定されたかどうか見てみましょう。

コード表示 2.6: 環境変数にロケールが設定されたかどうかの確認

# locale
LANG=
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=en_GB.UTF-8

これで完了です。今、UTF-8ロケールを使用しています。 次のハードルは、使用しているアプリケーションの設定です。

3.  アプリケーションのサポート

Unicodeがソフトウェア界で勢いがついてきたころ、 プログラマーが日々使用していたC言語などでは、マルチバイトの文字セットは適していませんでした。 今日でさえ、UTF-8を正しく扱うことのできないプログラムがあります。 しかし、幸いなことに多くのプログラムはUTF-8を扱えるようになっています!

NTFSやFATでのファイル名

Linuxカーネルの設定メニューにはいくつかのNLSオプションがあります。 しかし大事なことは混乱しないことです! おそらく、必要なことはUTF-8 NLSをカーネルに組み込むことと、デフォルトのNLSオプションをutf8にするだけです。

コード表示 3.1: UTF-8 NLSのためのカーネル設定

File Systems -->
  Native Language Support -->
    (utf8) Default NLS Option
    <*> NLS UTF8
    (お使いのFATファイルシステムやJoilet CD-ROMで使用している文字コードにも<*>を設定してください。)

NTFSパーティションをマウントする予定があるなら、nls=オプションをマウント時に指定する必要があります。 FATパーティションをマウントする予定があるなら、codepage=オプションをマウント時に指定する必要があります。 任意で、カーネル設定でFAT用のデフォルトcodepageを設定することも出来ます。 mountのcodepageオプションはカーネル設定を上書きすると言うことに注意してください。

コード表示 3.2: カーネル設定でのFATの設定

File Systems -->
  DOS/FAT/NT Filesystems  -->
    (437) Default codepage for fat

Default iocharset for fatをUTF-8に設定することは避けるべきです。これは推奨されていません。 その代わり、FATパーティションをマウントする際にutf8=trueオプションを渡すことが出来ます。 これ以上の情報は、man mount/usr/src/linux/Documentation/filesystems/vfat.txtにあるカーネルドキュメントを読んでください。

ファイル名のエンコーディングを変更するには、app-text/convmvが便利です。

コード表示 3.3: convmvの使用例

# emerge --ask app-text/convmv
(コマンド形式)
# convmv -f <現在のエンコード> -t utf-8 <ファイル名>
(iso-8859-1を変更したい文字コードに置き換える)
# convmv -f iso-8859-1 -t utf-8 filename

ファイルの中身を変更したい場合には、glibcに添付されているiconvを使用してください。

コード表示 3.4: iconvの使用例

(iso-8859-1を変換元の文字コードで置換してください)
(出力結果が正しいかどうか確認してください)
# iconv -f iso-8859-1 -t utf-8 filename 
(ファイルのコンバートを行うには、他のファイルを作成する必要があります)
# iconv -f iso-8859-1 -t utf-8 filename > newfile

app-text/recodeもまたこの目的で使うことができます。

システムコンソールでの使用

重要: コンソールでUnicodeを使うためには>=sys-apps/baselayout-1.11.9が必要です

UTF-8をコンソールで有効にするために、/etc/rc.confを編集しUNICODE="yes"とセットします。 そして、そのファイルのコメントを読むことも忘れないでください。 Unicodeをできるだけ利用する計画があるなら、十分な文字コードの範囲を持ったフォントを持つことが重要です。

/etc/conf.d/keymapsファイルの中で定義されているKEYMAP変数にUnicodeキーマップを指定する必要があります。

コード表示 3.5: /etc/conf.d/keymapsの設定例

(ukをあなたのロケールに変更してください。)
KEYMAP="uk"

ncursesとSlang

注意: Slangをインストールしていない、または使用していない方は、この章を飛ばしてください。

unicode/etc/make.confにグローバルUSEフラグとして追加するのはよい方法です。 そして、sys-libs/ncursessys-libs/slangを必要なら再度mergeしてください。 これは、システムの更新時にPortageが自動で行います。

コード表示 3.6: システムの更新

# emerge --update --deep --newuse world

また、これらのライブラリにリンクされいてるパッケージを、このUSEの変更を有効にするために再度ビルドする必要があります。 このために使うrevdep-rebuildツールは、gentoolkitパッケージに含まれています。

コード表示 3.7: ncursesまたはslangにリンクされているプログラムの再ビルド

# revdep-rebuild --soname libncurses.so.5
# revdep-rebuild --soname libslang.so.1

KDEとGNOMEとXfce

この3つのメジャなデスクトップ環境は完全にUnicodeをサポートしています。 また、このドキュメントで紹介した以上の設定も必要ありません。 これはグラフィックツールキット(QtまたはGTK+2)がUTF-8に対応しているからです。 また、これらのツールキット上で動くすべてのアプリケーションがUTF-8対応するはずです。

例外は、XlibとGTK+1です。GTK+1は、iso-10646-1 FontSpecが~/.gtkrcに書かれている必要があります(例えば-misc-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1)。 また、XlibまたはXawを使用するアプリケーションに、FontSpecのようなものを与える必要があります。そうしないと動きません。

注意: gnome1コントールセンターを使用していれば代わりに使うことができます。 どれかiso10646-1フォントをそこから選択してください。

コード表示 3.8: ~/.gtkrc(GTK+1用)を編集して、Unicode互換フォントを設定する

style "user-font"
{
    fontset="-misc-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1"
}
widget_class "*" style "user-font"

アプリケーションがQTとGTK+2の両方のGUIをサポートしている場合、 Unicodeに関してはGTK+2の方が一般的に良いです。

X11とフォント

重要: x11-base/xorg-x11は、XFree86よりもUnicodeのサポートが良く、 かなり推奨されています。

TrueTypeフォントはUnicodeをサポートしています。 また、Xorgに添付されて配布されているフォントの大部分には、文字に関するすばらしいサポートがあります。 しかし、明らかに、Unicodeに存在するすべての文字がそのフォント用に作成されたものではありません。 フォント(Bitstream Veraフォントセットを含む)をX用に東アジア文字を含めてビルドするためには、 cjkUSEフラグがセットされているか確認する必要があります。 他の多くのアプリケーションもcjkUSEフラグを使用しますので、 恒久的なUSEフラグとしてセットしておくといいかもしれません。

また、いくつかのUnicodeに対応したフォントパッケージがPortageにはあります。

コード表示 3.9: 任意選択: Unicode対応フォントのインストール

# emerge terminus-font intlfonts freefonts cronyx-fonts corefonts

ウインドウマネージャとターミナルエミュレータ

GTKまたはQtを使用していないウインドウマネージャは、フォントを扱うためにXftを使用していることが多いので、 Unicodeを非常にうまく使うことができます。 あなたが使用中のウインドウマネージャがXftを使用していない場合には、 前章で紹介したFontSpecをUnicodeフォントとして使用することができます。

Xftを使用し、Unicodeをサポートしているターミナルエミュレータを見つけるのはもっと大変です。 Konsoleとgnome-terminalは別として、Portageでの最良の選択肢は、 x11-terms/rxvt-unicodexfce-extra/terminalgnustep-apps/terminalx11-terms/mlterm、 または、unicode USEフラグ付きでビルドされ、uxtermとして起動されたx11-terms/xtermがあります。 また、app-misc/screenもUTF-8をサポートしてますが、screen -Uで起動するか、または以下の行を~/.screenrcに追加する必要があります。

コード表示 3.10: UTF-8のための~/.screenrc

defutf8 on

Vim、Emacs、Xemacs、Nano

Vimは完全にUTF-8をサポートしています。 また、UTF-8ファイルの自動認識機能も組み込まれています。 Vimでの、さらに詳しい情報は:help mbyte.txtを使用してください。

Emacs 22.x以降は完全にUTF-8をサポートしています。 Xemacs 22.xはまだ文字コードの統合をサポートしていません。

古いバージョンのEmacsやXemacsはapp-emacs/mule-ucsapp-xemacs/mule-ucsをインストールし、UTF-8でCJKサポートを行うために以下のコードを~/.emacsに追加する必要があります。

コード表示 3.11: EmacsのCJK UTF-8サポート

(require 'un-define)
(require 'jisx0213)
(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)

Nanoはバージョン1.3.6からUTF-8をフルサポートしていませす。

シェル

現在のところ、bashはGUN readlineライブラリを使用して、Unicodeをサポートしています。 zshユーザーには問題があります。zshでは、Unicodeがサポートされているところがありません。 しかし、マルチバイト文字セットのサポートを加えるための取り組みもあります。

csh、tcshkshではまったくUTF-8をサポートしていません。

Irssi

完全なUTF-8サポートがありますが、オプションをユーザーがセットする必要があります。

コード表示 3.12: IrssiでUTF-8を使用する

/set term_charset UTF-8

ASCII文字以外のチャンネルではしばしばUTF-8以外の文字が使用されています。 その場合には、/recodeコマンドによって、変換することができるかもしれません。 /help recodeでさらなる情報を取得できます。

Mutt

MuttメールエージェントはUnicodeをサポートしています。 UTF-8をMuttで使用するために、設定ファイルに何かする必要ありません。 すべての設定ファイル(署名も含む)がUTF-8エンコードであれば、Muttは修正を行うことなくUnicode環境で動作します。

注意: それでもまだ'?'がMuttにてメールの中に現れるかもしれません。 これは、そのユーザーが使用しているメールクライアントが、使用している文字セットを通知していないためです。 そのユーザーにメールクライアントを正しく設定してもらうようにお願いする以外に、解決の方法はありません。

さらなる情報はMutt WikiWikiにあります。

Man

manページはすべてのLinuxマシンの必要不可欠な部分です。 manページでunicodeが正しく表示されるために、/etc/man.confを編集して以下の行を置き換えます。

コード表示 3.13: Unicodeサポートのためにman.confを変更

(これは古い行です)
NROFF           /usr/bin/nroff -Tascii -c -mandoc
(上をこのように置き換えます)
NROFF           /usr/bin/nroff -mandoc -c

elinksとlinks

これらは一般にテキストブラウザとして使用されるので、これらでUTF-8サポートを有効にする方法を説明します。 elinkslinksでは、これを行うための2つの方法があります。 1つはブラウザのSetupオプションを使用することで、もう1つは設定ファイルを編集することです。 ブラウザにオプションを設定するために、サイトをelinkslinksで開き、Alt+Sで設定メニューに入り、ターミナルオプションを選択するか、Tを押します。 そして保存し、メニューを終了します。 linksではAlt+Sを繰り返し、保存するためにSを押す必要があるかもしれません。 設定ファイルオプションは以下に示します。

コード表示 3.14: UTF-8をelinks/linksで有効にする

(elinksでは、/etc/elinks/elinks.confまたは~/.elinks/elinks.confを編集し、以下の行を追加します)
set terminal.linux.utf_8_io = 1

(linksでは、~/.links/links.cfgを編集し、以下の行を追加します)
terminal "xterm" 0 1 0 us-ascii utf-8

Samba

Sambaとは、SMB(Server Message Block)プロトコルをMac、 Linux、FreeBSDのようなUNIXシステムで実装したソフトウェアスイートです。 プロトコルは、Common Internet File System(CIFS)と呼ばれることもあります。 また、SambaはNetBIOSシステム -- Windowsネットワーク上でファイル共有する際に使用されます -- も含みます。

コード表示 3.15: SambaでUTF-8の有効化

(/etc/samba/smb.confを編集し、[global]セクション以下に下記を追加します)
dos charset = 1255
unix charset = UTF-8
display charset = UTF-8

注意: 訳注: 日本語環境では、dos charset = cp932と設定してください。

テストする

多くのUTF-8をテストするためのWebサイトがあります。 net-www/w3mnet-www/linksnet-www/elinksnet-www/lynxや、 すべてのMozillaベースのブラウザ(Firefoxを含む)はUTF-8をサポートしています。 また、KonquerorとOperaもUTF-8をサポートしています。

テキストのみのブラウザを使用する場合には、Unicode対応のターミナルを使用してるかを必ず確認してください。

UTF-8で使用する記号または文字が使用中のフォントに含まれていないときには、 四角の中に文字または数字が入っているような文字が現れます。 UTF-8の文字の16進数コードが四角と一緒に表示されることもあります。

入力方法

dead keyをキーボードにない文字を入力するために使用するできるかもしれません。 これは、右のAltキー(国によっては、AltGrキー)と、 リターンキーの左側にあるアルファベットではない部分のオプションキーを同時に押し、その後両方のボタンを離し、さらに文字を押すことにより行うことができます。 dead keyを使用すうことにより、文字を変更することができます。 また、AltGrキーともう一つのキーと同時にシフトキーを押すことによって、入力をさらに変化させることができます。

dead keyをXで有効にするには、それをサポートしているレイアウトが必要です。 多くのヨーロッパ仕様のレイアウトでは、デフォルトの働きを持ったdead keyが既に設置されています。 しかし、北米仕様のレイアウトではそうではありません。 レイアウトにより違いはありますが、一番簡単な解決方法は、例えば"us"ではなく、"en_US"をレイアウトとして使うことです。 レイアウトは次のように/etc/X11/xorg.confで定義されています。

コード表示 3.16: /etc/X11/xorg.confの一部分

Section "InputDevice"
    Identifier "Keyboard0"
    Driver     "kbd"
    Option     "XkbLayout" "en_US" "us"ではなく
    (その他のXkbオプションがここに続きます )
EndSection

注意: この変更は北米仕様のレイアウトや他のdead keyが動作していないようなレイアウトを使用している場合にのみ適用が必要です。 ヨーロッパのユーザーは、そのままでdead keyが使えるはずです。

この変更はXサーバーをリスタートしたときに有効になります。 瞬時に変更を有効にするためには、setxkbmapツールが使用できます。 例えば、setxkbmap en_USとしてください。

おそらく、サンプル付きでdead keyについて説明するのが一番簡単な方法でしょう。 結果はロケールに依存しますが、考え方はロケールによらずに同一です。 この例はUTF-8を含んでいます。そのため参照するためには、 UTF-8としてこのページをブラウザで開き直すか、 UTF-8ロケールが既に設定されている必要があります。

AltGrと[を同時に押し、そして離します。その後でaを押すと'ä' が現れます。 AltGrと[を同時に押し、そして離します。その後でeを押すと'ë' が現れます。 AltGrと;を同時に押し、そして離します。その後でaを押すと'á' が現れます。 AltGrと;を同時に押し、そして離します。その後でeを押すと'á' が現れます。

AltGrとシフトと[を同時に押し、話します。そしてaを押すとスカンジナビアの'å' が現れます。 AltGrとシフトと[を同時に押し、[だけをもう一度押すと、'˚'が現れます。 これはあるものに見えますが、これ(U+02DA)は角度記号(U+00B0)とは別のものです。 これはdead keyを使用して他のアクセントを表示させる働きです。 AltGrと[を押し、[だけを一度離してから、もう一度押します。 すると'¨' が現れます。

AltGrは、アルファベットキーだけと使用することもできます。 例えば、AltGrとmは、ギリシア文字の小文字muである'µ' を生成します。 AltGrとsキーで、scharfes sまたはesszet 'ß'を生成します。 多くのヨーロッパのユーザーが期待するように(なぜならキーボードに刻印されているので)、AltGrと4(キーボードレイアウトによってはE)はユーロ記号である'€'を生成します。

参考資料