The Unicode HOWTO Bruno Haible, v0.15, 25 January 2000 早川 仁, V0.15j, 2000年01月01日 このドキュメントは UTF-8 をテキストエンコーディングとして使用するよう に Linux システムを変更する方法について説明しています。この文書は現在 作業中ですから tips、パッチ、助言、URL を大歓迎します。 ______________________________________________________________________ 目次 1. 翻訳について 1.1 訳語統一 1.2 参考文献 1.3 翻訳者謝辞 1.4 最新版の原文のありか 2. イントロダクション 2.1 なぜ Unicode を使うのですか? 2.2 Unicode のエンコーディング 2.2.1 C/C++ 開発者への補足説明 2.3 関連文書 3. 表示の設定 3.1 Linux コンソール 3.2 X11 外国語フォント 3.3 X11 Unicode フォント 3.4 Unicode xterm 3.5 その他 4. ロケール設定 4.1 ファイルとカーネル 4.2 tty とカーネル 4.3 一般的なデータ変換 4.4 ロケールの環境変数 4.5 ロケールサポートファイルの作成 4.6 C ライブラリにサポートを追加する 4.7 メッセージカタログのコンバート 5. アプリケーション固有の情報 5.1 ネットワーク 5.1.1 rlogin 5.1.2 telnet 5.2 ブラウザ 5.2.1 Netscape 5.2.2 lynx 5.2.3 テスト用ページ 5.3 エディタ 5.3.1 yudit 5.3.2 mined98 5.3.3 vim 5.3.4 emacs 5.3.5 xemacs 5.3.6 nedit 5.3.7 xedit 5.3.8 axe 5.3.9 pico 5.4 メーラ 5.4.1 pine 5.4.2 kmail 5.4.3 Netscape Communicator 5.4.4 emacs (rmail, vm) 5.4.5 mutt 5.5 テキスト操作 5.5.1 groff 5.5.2 TeX 5.6 データーベース 5.6.1 PostgreSQL 5.7 その他のテキストモードのアプリケーション 5.7.1 less 5.7.2 expand, wc 5.7.3 col, colcrt, colrm, column, rev, ul 5.7.4 figlet 5.7.5 kermit 5.8 その他の X11 アプリケーション 6. あなたのプログラムで Unicode を扱えるようにする 6.1 C/C++ 6.1.1 通常のテキストハンドリング 6.1.1.1 可搬性(Portability)について 6.1.1.2 libutf8 ライブラリ 6.1.1.3 Plan9 の場合 6.1.2 GUI 用には 6.1.3 先進的なテキスト操作 6.1.4 変換用には 6.1.4.1 iconv 6.1.4.2 librecode 6.1.5 その他のアプローチ 6.2 Java 6.3 Lisp 6.4 Ada95 7. 他の情報源 7.1 メーリングリスト 7.1.1 linux-utf8 7.1.2 li18nux 7.1.3 unicode 7.1.4 X11 国際化 7.1.5 X11 フォント ______________________________________________________________________ 1. 翻訳について 1.1. 訳語統一 訳語は、当文書の中では以下で統一してあります。 character set 文字セット script 用字 locale ロケール wide character ワイド文字 用字(script)とは 1 つ以上の言語の表記の方法で使用する、図形文字の集合 のことだそうです。 たとえば「ひらがな」「カタカナ」「ラテン文字(アルファベット)」といった 文字の種類を指します。日本語は「ひらがな」「カタカナ」「ラテン文字」 「日本漢字」といったように多数の用字を混在して使う言語ですが、英語は通 常ラテン文字しか使いません。 1.2. 参考文献 翻訳にあたり、以下の文献を参考としました。 o 「国際化プログラミング I18Nハンドブック」清兼義弘・末廣陽一/編著 o BSD magazine 1999 No.2 「BSD における国際化」わたなべごう/著 1.3. 翻訳者謝辞 翻訳の際には以下の方々に多数の有益なコメント、校正をしていただきまし た。ありがとうございました。 o 佐藤亮一さん o 藤原輝嘉さん o 武井伸光さん o 斎藤幹さん o 森本淳さん o 中野武雄さん 1.4. 最新版の原文のありか オリジナルの Unicode-HOWTO 最新版は にありま す。 2. イントロダクション 2.1. なぜ Unicode を使うのですか? 異なった国の人々は、それぞれの母国語の単語を表現するのに異なった文字を 使用しています。現在では email システムや web ブラウザなど、ほとんどの アプリケーションは 8 ビットクリーンです。つまり ISO-8859-1 のような 8 ビット文字セットで表現されるテキストの取り扱いや表示を正しく行えるとい うことです。 世界には 256 よりも遥かに多くの文字があります。例えばキリル文字、ヘブ ライ語、アラビア語、中国語、日本語、韓国語、タイ語などです。新しい文字 も時々作られています。利用者に問題になってくることには次のようなものが あります。 o 一つの文書の中に異なる文字セットの文字を混在させることができない場 合。例をあげると TeX, xdvi, PostScript を使っている場合には、ドイツ 語やフランス語の文書でロシア語での引用をすることができますが、ただ のテキストファイルでは無理です。 o それぞれの文書が固有の文字セットを持ち、文字セットの認識が自動でな ければ、ユーザーが介在してこれを手動で行わなければなりません。例え ば XTeamLinux distribution のホームページ http://www.xteamlinux.com.cn/ を見るためには、Netscape にその web ページは GB2312 コードであると指示する必要があります。 o ユーロのような新しいシンボルも生み出されています。ISO は新しい標準 ISO-8859-15 を発表(issue)しました。これはほとんど ISO-8859-1 と同じ ですが、ほとんど使われない文字(古い通貨のマーク)を取り除いて、ユー ロのマークと置き換えました。ユーザーがこの標準を使用することにした 場合、ディスク内に違った文字セットの文書を持つことになります。つま り、文字セットのことを常に考慮する日々のはじまりということです。で すがコンピュータは物事をシンプルにするためのものであり、より複雑に するものではありません。 この問題を解決するには、ワールドワイドに使用できる文字セットを使うこと です。その文字セットとは Unicode http://www.unicode.org/ のことで す。Unicode に関する詳細は `man 7 unicode' を実行してくださ い。(manpage は man-pages-1.20 パッケージに含まれています) 2.2. Unicode のエンコーディング Unicode エンコーディングを使うと、文字セットを扱うユーザープログラムの 問題は、「どうやって 1 オクテット(8 ビット)で Unicode 文字を送るのか」 という技術的な問題だけになります。8 ビットという単位は、多くのコンピュ ータで、アドレスを表現する最小単位です。またこの 8 ビットという単位 は、TCP/IP ネットワークでのコネクションにも使用されています。1 文字を 表現するのに 1 バイトを使用するというのは歴史的な偶然であり、これはコ ンピュータの開発がヨーロッパとアメリカで始まったことによります。これら の国々では長い間、96 種類の文字で充分とされてきました。 Unicode 文字をバイトでエンコードする方法には、通常 4 種類あります。 UTF-8 128 文字が 1 バイトでエンコードされます(ASCII 文字)。1920 文字が 2 バイトでエンコードされます(ローマ字、ギリシャ文字、キリル文 字、コプト語、アルメニア語、ヘブライ語、アラビア語の文字)。63488 文字が 3バイトでエンコードされます(中国語や日本語など)。残りの 2147418112 文字は 4 〜 6 バイトを使ってエンコードすることができ ます(まだ割り当てられていません)。UTF-8 に関する詳細は `man 7 utf-8' を実行してください。(manpage は ldpman-1.20 パッケージに 含まれています) UCS-2 全ての文字は 2 バイトで表現されます。このエンコーディングでは Unicodeの始めの 65536 文字だけを表現できます。 UTF-16 これは UCS-2 の拡張で 1112064 の Unicode 文字を表現することがで きます。 Unicode の始めの 65536 文字は 2 バイトで、残りは 4 バイ トで表現されます。 UCS-4 全ての文字は 4 バイトで表現されます。 テキストをエンコードするのに必要となる容量(ヨーロッパの言語では 1 文字 あたり 8ビットで、中国語、日本語、韓国語ではより多くのビット数)を、現 在使用されているエンコーディングと比べたものが以下になります。これは ディスクで使用する容量や、ネットワークでのダウンロード速度に影響します (圧縮をしていない場合)。 UTF-8 US ASCII なら変化なし、ISO-8859-1 なら数パーセント増え、中国語、 日本語、韓国語では 1.5 倍、ギリシャ文字やキリル文字では 2 倍にな ります。 UCS-2 および UTF-16 中国語、日本語、韓国語では変化なし、ASCII、ISO-8859-1、ギリシャ 文字、キリル文字では 2 倍になります。 UCS-4 中国語、日本語、韓国語では 2倍、ASCII、ISO-8859-1、ギリシャ文 字、キリル文字では 3 倍になります。 UCS-2, UTF-16, UCS-4 で US やヨーロッパの文書を書く場合にはASCII や ISO-8859-1 で書いたときよりもサイズが大きくなることがあるため、それら のエンコーディングが広く使われることはなさそうです。 Microsoft の Win32 API は UCS-2 エンコーディングを(少なくとも) 1995 年からサポート していますが、UCS-2は文書を記述するのに広く使われてはいません。日本で はシフト JIS がいまだ一般的です。 一方、US やヨーロッパの利用者にはペナルティがなく、また多くのテキスト 操作を行うプログラムは UTF-8 サポートのための変更が必要ないので、UTF-8 は広く使われる可能性があります。 これから、テキストのエンコーディングとして UTF-8 を使うように Linux シ ステムを変更する方法について説明していきます。 2.2.1. C/C++ 開発者への補足説明 Microsoft が Win32 API で取っているアプローチでは、開発者が Unicode 版 のプログラムを作成することは簡単です。"#define UNICODE" をプログラムの 先頭で宣言して、コンパイルエラーがなくなるまで `char' を `TCHAR' へ変 更します。この方法の問題は、最終的に 2 つのバージョンのプログラムがで きてしまうことです。1 つは UCS-2 のテキストを扱えますが、8 ビットのエ ンコーディングは駄目です。もう 1 つは旧来の 8 ビットエンコーディングし か扱えません。 さらに UCS-2 と UCS-4 にはエンディアンの問題があります。The Internet Assigned Numbers Authority (IANA) character set registry http://www.isi.edu/in-notes/iana/assignments/character-sets は ISO-10646-UCS-2 についてこのように述べています: 「これにはネットワークバイトオーダーを指定する必要がある: 標 準は定められていない」 ネットワークバイトオーダーはビッグエンディアンです。また RFC 2152 に、 より明確に記述されています:「ISO/IEC 10646-1:1993(E) にはUCS-2 の文字 がオクテットで表現される時には、最も大きいオクテットが始めに来ると示さ れています」ところが Microsoftは自社の C/C++ 開発ツールではマシン依存 のエンディアン(つまり intel x86 系のプロセッサではリトルエンディアン) を使用することと、ドキュメントの始めにバイトオーダーのマークもしくは統 計的検出法(statistical heuristics)を使用することを推奨しています。 (訳注: heuristics とは例えば、バイトオーダが入れ替わっているような状 態では何の手がかりもないと、どんなキャラクタセットかわからない。でも例 えば日本語の文章の場合には統計的に、'、' や `。' などはそれなりの頻度 で現れると予測されるので、もしそうなら日本語じゃないかと判断するような ことです) それに対して UTF-8 のアプローチでは、`char*' を C の標準の文字列型のま まとしています。結果としてプログラムは ASCII テキストを環境変数に関わ らず扱うことができ、また LANG 環境変数を指定すれば ISO-8859-1 と UTF-8 でエンコードされたテキストをも扱うことができます。 2.3. 関連文書 Markus Kuhn の最新リソースリスト: o http://www.cl.cam.ac.uk/~mgk25/unicode.html o http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html Roman Czyborra の Unicode、UTF-8 および UTF-8 対応プログラムのオーバー ビュー: http://czyborra.com/utf/#UTF-8 UTF-8 ファイルの例: o Markus Kuhn の ucs-fonts パッケージ quickbrown.txt, UTF-8-test.txt, UTF-8-demo.txt. o ftp://ftp.cs.su.oz.au/gary/x-utf8.html o Kosta Kostis の trans-1.1.1 パッケージの iso10646 ファイル ftp://ftp.nid.ru/pub/os/unix/misc/trans111.tar.gz o ftp://ftp.dante.de/pub/tex/info/lwc/apc/utf8.html o http://www.cogsci.ed.ac.uk/~richard/unicode-sample.html 3. 表示の設定 ここでは、既に Linux のコンソールと X11 の設定を、使用しているキーボー ドとロケールにあわせてあると仮定します。この方法は デンマーク/インター ナショナル HOWTO や 他の国(Finnish(フィンランド), French(フランス), German(ドイツ), Italian (イタリア), Polish(ポーランド), Slovenian(スロ ベニア), Spanish(スペイン), Cyrillic(キリル), Hebrew(ヘブライ), Chinese(中国), Thai(タイ), Esperanto(エスペラント)) の HOWTO で説明さ れています。ただ、 Thai HOWTO で説明されている方法には従わないでくださ い。ISO-8859-1 の文字(U0000..U00FF) を使用してもタイ語の文字 (U0E01..U0E5B) になってしまいます。これは Unicode に変更するときに問題 となります。 (訳注:日本語版のほとんどのディストリビューションでは既に設定済みです が、もしまだであれば JF プロジェクトにある Keyboard-and-Console-HOWTO が役にたつでしょう) 3.1. Linux コンソール ここでは Linux コンソールについてあまり多くは述べません。私が xdm を動 かしていないマシンを使う場合、単にログイン名とパスワードを入力して "xinit" を実行するだけだからです。 kbd-0.99 パッケージ ftp://sunsite.unc.edu/pub/Linux/system/keyboards/kbd-0.99.tar.gz と、 それをかなり拡張したバージョンである console-tools-0.2.2 パッケージ ftp://sunsite.unc.edu/pub/Linux/system/keyboards/console- tools-0.2.2.tar.gz には kbd-0.99/src/ (もしくは console-tools-0.2.2/screenfonttools/)ディレクトリに二つのプログラム `unicode_start' と `unicode_stop' があります。 `unicode_start'を呼びだすと、コンソールのスクリーンへの出力は UTF-8と 解釈されます。またキーボードは Unicode モード("man kbd_mode" を参照)に 入ります。このモードでは、Alt-x1 〜 Alt-xn(x1 〜 xn はテンキー上の数値 です) で入力された Unicode 文字は UTF-8 となります。あなたのキーボード に (正確にはあなたの通常のキーマップに) 非 ASCII 文字のキー(たとえばド イツ語のウムラウト)があり、その文字をキャップスロックしたい場合には、 カーネルパッチ linux-2.2.9-keyboard.diff もしくは linux-2.3.12-keyboard.diff をあてる必要があります。 スクリーン上で同時に異なった種類の文字を表示する場合、Unicode コンソー ルのためのフォントが必要となりま す。ftp://sunsite.unc.edu/pub/Linux/system/keyboards/kbd-0.99.tar.gz および ftp://sunsite.unc.edu/pub/Linux/system/keyboards/console- data-1999.08.29.tar.gz パッケージに含まれているフォン ト(LatArCyrHeb-{08,14,16,19}.psf) はラテン語、キリル文字、ヘブライ語、 アラビア語の文字をカバーします。つまりこれ一つで ISO 8859 の 1,2,3,4,5,6,8,9,10 をカバーします。インストールするには /usr/lib/kbd/consolefonts/ へコピーし、 /usr/lib/kbd/consolefonts/LatArCyrHeb-14.psf" を実行します。 カット & ペーストを UTF-8 のコンソールで動作させたいのであれば、 Edmund Thomas Grimley Evans と Stanislav Voronyi によるパッチ linux-2.3.12-console.diff が必要になります。 3.2. X11 外国語フォント キリル文字、中国語、日本語などのフォントのインストールをためらう理由は ありません。それらが Unicode フォントではないとしても、Unicode の文書 を表示する時に役立ちます。少くとも Netscape Communicator 4 と Java は、可能な時には外国語のフォントを利用します。 以下は、フォントをインストールする時に便利なプログラムです。 o "mkfontdir directory" は X サーバーが使用する font ディレクトリを準 備します。これはディレクトリにフォントをインストールした後に実行す る必要があります。 o "xset fp+ directory" は X サーバーのカレントフォントパスに directory を追加します。恒久的にディレクトリを追加するのであれ ば、/etc/XF86Config ファイルの "Files" セクションに "FontPath" 行を 追加します。 o "xset fp rehash" を mkfontdir を呼びだしたあとに実行する必要があり ます。これはフォントパスを現在値にリセットし、カレントフォントパス のフォントデータベースを X サーバに再読み込みさせます。 o "xfontsel" で、インストールされている各種フォントのプロパティをマウ スで選択してブラウズすることができます。 o "xlsfonts -fn fontpattern" は fontpattern にマッチしている全ての フォントをリスト表示し、各種フォントのプロパティを表示しま す。"xlsfonts -ll -fn font" を実行すると、フォントプロパティ CHARSET_REGISTRY と CHARSET_ENCODING をリスト表示します。これらのプ ロパティはフォントのエンコーディングを決定します。 o "xfd -fn font" はページ毎に font を表示します。 次のフォントは自由に利用できます(完全なリストではありません): o XFree86 に含まれるもの。別のパッケージになってるかもしれません。例 えば SuSE には普通の 75dpi フォントのみが 基本の `xf86' パッケージ に入っています。その他のフォントはパッケージ `xfnt100', `xfntbig', `xfntcyr', `xfntscl' に含まれています。 o ftp://ftp.gnu.org/pub/gnu/intlfonts/intlfonts-1.2.tar.gz の Emacs 国際フォント。既に言及されているように、GNU Emacs より XEmacs を好 む場合や Emacs を使わない場合であっても、これらは役に立ちます。 3.3. X11 Unicode フォント アプリケーションで異なる用字(例えばキリル文字やギリシャ文字)のテキスト を同時に表示するには、異なる X フォントを使うことによって可能になりま す。これは Netscape Communicator と Java が行なっていることです。です がこの方法はより複雑です。プログラマーは `Font' と `XFontStruct' を利 用するかわりに `XFontSet' を扱わなければならなく、その上さらにフォント セットの全てのフォントが同じ文字幅を持っているわけではないからです。 o Markus Kuhn は Unicode でエンコードされた固定幅の 75dpi フォントを 作りました。これはラテン語、ギリシャ語、キリル文字、アルメニア語、 グルジア語、ヘブライ語、記号をカバーしています。つまり ISO 8859 の 1,2,3,4,5,7,8,9,10,13,14,15 全てを 1 つでカバーします。このフォント は xterm を utf-8 モードで実行する必要があります。 http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz o Roman Czyborra は Unicode でエンコードされた 8x16 / 16x16 幅 75dpi フォントを作りました。これは Unicode の非常に多くの部分をカバーして います。 unifont.hex.gz と hex2bdf を http://czyborra.com/unifont/ からダウンロードしてください。また、これは固定幅ではありません:ヨ ーロッパの文字は 8 ピクセル幅、中国語などの文字は 16 ピクセルです。 次のようにして、インストールを行ないます。 $ gunzip unifont.hex.gz $ hex2bdf < unifont.hex > unifont.bdf $ bdftopcf -o unifont.pcf unifont.bdf $ gzip -9 unifont.pcf # cp unifont.pcf.gz /usr/X11R6/lib/X11/fonts/misc # cd /usr/X11R6/lib/X11/fonts/misc # mkfontdir # xset fp rehash o Primoz Peterlin は ETL ファミリーのフォントを作りました。これはラテ ン語、ギリシャ語、キリル文字、アルメニア語、グルジア語、ヘブライ語 をカバーしています。 ftp://ftp.x.org/contrib/fonts/etl-unicode.tar.gz インストールするには "bdftopcf" プログラムを使用します。 3.4. Unicode xterm xterm は X11R6 と XFree86 の 1 部なのですが、Tom Dickey により別にメン テナンスされています。 http://www.clark.net/pub/dickey/xterm/xterm.html 新しい バージョン(パッチレベル 109 以降)は、xterm で動作しているアプリ ケーションにキーストロークを送る前にキーストロークを UTF-8 にコンバー トする機能と、アプリケーションの出力する Unicode 文字を UTF-8 のバイト シーケンスとして表示する機能をサポートしています。 UTF-8 をサポートする xterm を実行するには、次のようにします。 o http://www.clark.net/pub/dickey/xterm/xterm.tar.gz を入手 o "./configure --enable-wide-chars ..." を実行して設定を行ない、コン パイルおよびインストールを行なう o Unicode 固定幅フォントをインストールする。Markus Kuhn の ucs-fonts.tar.gz(上記を参照)はこのために使えるでしょう。 o "xterm -u8 -fn fixed" を実行します。"-u8" オプションは Unicode と UTF-8 のハンドリング機能を有効にします。"fixed" で指定するフォント は Markus Kuhn の Unicode フォントです。 o Markus Kuhn の ucs-fonts パッケージに含まれるサンプルファイルを覗い てみると、ギリシャ語やロシア語などの文字が見えるはずです。 $ cd .../ucs-fonts $ cat quickbrown.txt $ cat utf-8-demo.txt o xterm の起動時から UTF-8 をハンドリングする機能を有効にするには、 XTerm*utf8: 1 という行を $HOME/.Xdefaults に追加します(自分自身の設 定だけを変える場合)。システム全体の設定である /usr/X11R6/lib/X11/app-defaults/XTerm を変更することはお勧めしませ ん。 XFree86 の新しいバージョンにアップグレードした際に、変更が消さ れてしまうからです。 (訳注:個人的には逆にアップグレードまでは大丈夫なので、システムワイ ドな設定の方を好みます) o フォントも変更するのであれば、 *VT100*font: フォント名 のような行が $HOME/.Xdefaults に必要となります。 "fixed" の場合には指 定する必要はありません。 Robert Brady , による、倍のサイズのワイド文字 (CJK の表意文字など)の実装、結合(combine)をするためのパッチ はhttp://www.ecs.soton.ac.uk/~rwb197/xterm/ です。 これは xterm パッチレベル 120 http://www.clark.net/pub/dickey/xterm/xterm-120.tgz ベースです。次のよ うな設定で使うのがよいでしょう。 *VT100*font: -Misc-Fixed-Medium-R-Normal--18-120-100-100-C-90-ISO10646-1 *VT100*wideFont: -Daewoo-Gothic-Medium-R-Normal--18-18-100-100-M-180-ISO10646-1 3.5. その他 Linux のコンソールや xterm が UTF-8 モードかどうかをテストする簡単なプ ログラム testUTF-8.c と testUTF8.c が、Ricardas Cepas のパッケージ ftp://sunsite.unc.edu/pub/Linux/system/keyboards/x-lt-1.18.tar.gz にあ ります。 4. ロケール設定 4.1. ファイルとカーネル すでに、どのような Unicode 文字でもファイル名として使えるようになって います。カーネルやファイルユーティリティの修正は必要ありません。カーネ ル内でのファイル名はヌル文字や / を含まない限り何でもかまいません(/ は サブディレクトリの区切りに使われているからです)。UTF-8 を使用してエン コードされる時に、非 ASCII 文字がヌル文字や / にエンコードされることは ありません。ファイルやディレクトリの名前が文字数よりも多くのバイト数を 占めるだけです。例えば 5 つのギリシャ文字からなるファイル名はカーネル からは 10 バイトのファイル名として見えます。カーネルはこれらがギリシャ 文字で表示されるということを知りませんし、知る必要もありません。 これが基本原理です。ファイルが Linux だけで使われるのであれば。他の OS から使用されるファイルシステムのためには、ファイル名を UTF-8 と相互に コンバートするマウントオプションがあります。 o "vfat" ファイルシステムにはマウントオプション "utf8" があります。 file:/usr/src/linux/Documentation/filesystems/vfat.txt を見てくださ い。デフォルト("iso8859-1" です)ではなく "iocharset" マウントオプ ションを指定した場合には "utf8"を使用するどうかに関わらず、結果には 一貫性がありません。ですから "iocharset" マウントオプションはお勧め しません。 o "msdos"、"umsdos" ファイルシステムも同じマウントオプションを持って いますが、何も起こらないようです。 o "iso9660" ファイルシステムにはマウントオプション "utf8" がありま す。 file:/usr/src/linux/Documentation/filesystems/isofs.txt を見て ください。 o 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" コマンドを実行すると何行でも入力や編集が でき、また各行はエコーバック(訳注:入力した文字のエコー表示)されます。 カーネルの編集機能は正常に動作しません。特に、バックスペースキーとタブ キーは正しく扱われません。 この問題を修正するには、次のようにします。 o 次のうち対応するカーネルパッチをあて、カーネルの再コンパイルをしま す。 linux-2.0.35-tty.diff, linux-2.2.9-tty.diff, linux-2.3.12-tty.diff o glibc2 を使っているのであれば、パッチ glibc211-tty.diff をあてて libc の再コンパイルを行います。冒険が好きでなければ、既にインストー ルされているインクルードファイルにパッチ glibc-tty.diff をあてるだ けで充分です。 o パッチ stty.diffを GNU sh-utils-1.16b にあてて "stty" プログラムの リビルドを行ない、"stty -a" と "stty iutf8" を使ってテストをしま す。 o "stty iutf8" コマンドを "unicode_start" スクリプトに、 "stty -iutf8" コマンドを "unicode_stop" スクリプトに追加します。 o パッチ xterm.diff を xterm-109 にあてて "xterm" のリビルドを行い、 "xterm - u8" や "xterm +u8" を実行して、そこで "stty -a" や "cat" を動かしてテストします。 rlogin や telnet をしてもこの修正を有効にし続けるには次のことをする必 要があります: o 環境変数 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" を付けます。例はこの term- cap.diff です。 o コンソールから "unicode_start" や "unicode_stop" を呼びだす度に、そ れぞれ "export TERM=linux-utf8" や "export TERM=linux" も実行してく ださい。 o パッチ xterm2.diffを xterm-109 にあてて "xterm" をリビルドし、 /usr/X11R6/lib/X11/app-defaults/XTerm と $HOME/.Xdefaults から全て の "XTerm*termName" 行を取り除きます。これで xterm が UTF-8 モード で実行されている時の TERM 変数は "xterm" の代わりに "xterm-utf8" と なっています。 o パッチ 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 があります。 他の文字セットから 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 を使用して、文字列を適切に元の文字セット からユーザーの文字セットへコンバートするでしょうから。 5. アプリケーション固有の情報 5.1. ネットワーク 5.1.1. rlogin は上記で述べたパッチでうまく動作します。 5.1.2. telnet デフォルトでは telnet は 8 ビットクリーンではありません。Unicode のキ ーストロークをリモートのホストへ送るためには、telnet を "outbinary" モ ードにセットする必要があります。そのためには次の 2 つの方法がありま す。 $ telnet -L もしくは $ telnet telnet> set outbinary telnet> open さらに上記で述べたパッチも使用してください。 5.2. ブラウザ 5.2.1. Netscape Netscape 4.05 以降では UTF-8 でエンコードされた HTML 文書を表示するこ とができます。そのためには全ての文書で と タグの間にこ のような行が必要です。 Netscape 4.05 以降では、バイトオーダーのマークが付いた UCS-2 エンコー ディングの HTML やテキストファイルも表示できます。 http://www.netscape.com/computing/download/ 5.2.2. lynx lynx2.8 にはオプション設定用の画面('O' キーを押下)があり、ここで表示す る文字セットを設定することができます。UTF-8 モードの xterm や Linux コ ンソールで実行している時には、これを "UNICODE UTF-8" にセットします。 ここでもう一度。全ての文書には と タグの間に次のような 行が必要です。 UTF-8 でエンコードされたテキストファイルを見るときには、コマンドライン オプション "-assume_local_charset=UTF-8"(file:/... の URL だけに影響を 及ぼします)、もしくは "-assume_charset=UTF-8"(全ての URL に影響を及ぼ します)も必要となります。lynx-2.8.2 ではオプション設定画面('O' キーを 押下)で "仮定する文字セット/assumed document character set" を "utf-8" に変更することもできます。 (訳注: 設定画面のオプション名(日本語・英語共に)は、Kondara MNU/Linux 1.0 に同梱されている lynx 2.8.2-3k1 で確認しました) オプション設定画面には "使用したい文書のキャラクターセット/preferred document character set" オプションもありますが、少なくとも apache-1.3.0 における file:/... URL と http://... URL では何の効果もあ りません。 文字のスペーシングおよびラインブレークには問題があります(x-utf8.html のロシア語のセクションや utf-8-demo.txt を見てみてください)。 さらに lynx-2.8.2 では --enable-prettysrc で設定されている場合、表示文 字セットが "UNICODE UTF-8" にセットされているとカラー表示が正常に動作 しません。これは簡単なパッチ lynx282.diff で修正することができます。 Lynx 開発者曰く、「UTF-8 でのスクリーン表示をするために普段 lynx を利 用する場合であっても、slang ライブラリと -DSLANG_MBCS_HACK オプション でコンパイルすることを依然としてお勧めします」です。 ftp://ftp.gnu.org/pub/gnu/lynx/lynx-2.8.2.tar.gz http://lynx.browser.org/ http://www.slcc.edu/lynx/ ftp://lynx.isc.org/ 5.2.3. テスト用ページ ブラウザのためのテストページが、Alan Wood のサイト http://www.hclrss.demon.co.uk/unicode/#links および James Kass のサイ ト http://home.att.net/~jameskass/ にあります。 5.3. エディタ 5.3.1. yudit Gaspar Sinai の yudit http://czyborra.com/yudit/は、X Window System 用 のすばらしい unicode テキストエディターです。多くの言語やインプットメ ソッド、ローカルの文字セットへのコンバートをサポートしており、キーボー ド設定マップを使用することにより、英語キーボードだけで全ての言語でのテ キストの入力を行なうことが可能になります。 次の 3 種類のバージョンをコンパイルすることができます: Xlib GUI, KDE GUI, Motif GUI カスタマイズは非常に簡単です。一般的なカスタマイズは、まずフォントから でしょう。フォントメニューから "Unicode" を選び、コマンド "xlsfonts ' *-*-iso10646-1'" ではまだフォントサイズが適当ではないため、(Markus Kuhn の 13 ピクセル固定フォントにマッチさせるため)フォントサイズ 13 を 選択しました。 次にインプットメソッドのカスタマイズを行ないます。インプットメソッドは "Straight", "Unicode", "SGML" がベストの選択でしょう。他のビルトイン・ インプットメソッドの詳細は /usr/local/share/yudit/data/ を御覧くださ い。 次に実行した時にも変更を有効にするためには、$HOME/.yuditrc ファイルを 編集してください。 このエディターの基本的な機能は編集、カット & ペースト、検索および置換 だけです。アンドゥはありません。 5.3.2. mined98 mined98 は Michiel Huisjes, Achim Mueller, Thomas Wolff が作った小さな テキストエディターです。http://www.inf.fu-berlin.de/~wolff/mined.html これは UTF-8 あるいは 8 ビット の xterm で、UTF-8 や 8 ビットでエンコ ードされたファイルの編集をすることができます。また Unicode 文字の入力 のための強力な機能があります。 UTF-8 モードの xterm や Linux コンソールで実行している時には、環境変数 utf8_term をセットするか、もしくは mined をコマンドライン引数 -U で起 動する必要があります。 mined では 8 ビットや UTF-8 でエンコードされたファイルを編集することが できます。デフォルトでは発見的自動検出(autodetection heuristic)を行な いますが、これを使用したくない時は、UTF-8 ファイルを編集する時にはコマ ンドライン引数 -u を、8 ビットエンコーディングされたファイルを編集する 時には +u を付けて起動します。設定はいつでもエディター内で変更すること ができます。エンコーディングはメニュー行に("L:h" は 8 ビットで、 "U:h" は UTF-8)表示されています。変更するにはこの文字の始めをクリックしてく ださい。 注意点: o ディストリビューションに含まれているバイナリファイルは古く、UTF-8 をサポートしていません。ソースからバイナリをリビルドする必要があり ます。それから src/mined を /usr/local/bin/mined とし て、doc/mined.help を /usr/local/man/cat1/mined.1 としてインストー ルします。そうすれば ESC h コマンドでマニュアルを見付けることができ ます。 o mined は "stty erase" 設定を無視します。バックスペースキーが ASCII コード 127 を send し、また "stty erase ^?" を設定している場合に は(これらは正しい設定です)、mined を -B 引数で起動する必要がありま す。これにより、バックスペースキーがカーソルの左の文字を消すように なります。 o "Home", "End", "Delete" キーは動作しません。 5.3.3. vim vim(version 5.4m 以降)はマルチバイトロケールをサポートしますが、X library がこのサポート機能を持っている必要があります。また 1 文字を表 現するのに最大でも 2 バイトのエンコーディング(ISO-2022 エンコーディン グなど)のみであり、UTF-8 はサポートしません。 5.3.4. emacs まず始めに Emacs マニュアルの "International Character Set Support" セ クション("International" ノード)を読んでください。特に Emacs を起動す るにはコマンド $ emacs -fn fontset-standard を実行する必要があることに注意してください。これにより、多くの国の文字 のフォントセットを使うことができます。 Otfried Cheong の emacs-utf パッケージ http://www.cs.ust.hk/faculty/otfried/Mule/ により "unicode-utf-8" エン コーディングを、宮下 尚の Mule-UCS package ftp://etlport.etl.go.jp/pub/mule/Mule-UCS/Mule-UCS-0.70.tar.gz (http://riksun.riken.go.jp/archives/misc/mule/Mule-UCS/Mule- UCS-0.70.tar.gz にミラーされています)により "utf-8" エンコーディングを Emacs で扱えるようになります。両方のパッケージを同時に利用することもで きます。emacs-utf "unicode-utf8" エンコーディングの利点はロードが速 く、数学記号やアクセント付きの文字などの非 CJK 文字を表示にするのによ り良いフォントを選んでくれることです。Mule-UCS "utf-8" エンコーディン グの利点は、ファイルの読み書きだけではなく(M-x で起動する) process buffer でもそのエンコードを利用できることです。 emacs-utf パッケージをインストールするには "utf2mule" プログラムをコン パイルしてunicode.el, muleuni-1.el, unicode-char.el と一緒に $PATH の どこかにインストールし、次の設定を $HOME/.emacs ファイルに追加します。 (setq load-path (cons "/home/user/somewhere/emacs" load-path)) (if (not (string-match "XEmacs" emacs-version)) (progn (require 'unicode) (if (eq window-system 'x) (progn (setq fontset12 (create-fontset-from-fontset-spec "-misc-fixed-medium-r-normal-*-12-*-*-*-*-*-fontset-standard")) (setq fontset13 (create-fontset-from-fontset-spec "-misc-fixed-medium-r-normal-*-13-*-*-*-*-*-fontset-standard")) (setq fontset14 (create-fontset-from-fontset-spec "-misc-fixed-medium-r-normal-*-14-*-*-*-*-*-fontset-standard")) (setq fontset15 (create-fontset-from-fontset-spec "-misc-fixed-medium-r-normal-*-15-*-*-*-*-*-fontset-standard")) (setq fontset16 (create-fontset-from-fontset-spec "-misc-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard")) (setq fontset18 (create-fontset-from-fontset-spec "-misc-fixed-medium-r-normal-*-18-*-*-*-*-*-fontset-standard")) ; (set-default-font fontset15) )))) フォントセットを有効にするには Mule メニューの "Set Font/FontSet" を選 択するか、Shift を押しながらマウスの左ボタンをクリックします。Markus Kuhn の 9x15 および 6x13 フォントでは、高さ 15 と 13 のフォントセット が Unicode には最適です。フォントセットを初期のフォントセットとして指 定するには、上記のコードの set-default-font 行をアンコメントします(コ メント(;)を取ります)。 Mule-UCS パッケージをインストールするには $ emacs -batch -l mucs-comp.el を実行し、作成された un-define.elc を適当な所にインストールして、次の 行を $HOME/.emacs ファイルに追加します。 (setq load-path (cons "/home/user/somewhere/emacs" load-path)) (if (not (string-match "XEmacs" emacs-version)) (progn (require 'un-define) )) UTF-8 でエンコードされたファイルをオープンするには、 M-x universal-coding-system-argument unicode-utf8 RET M-x find-file filename RET あるいは C-x RET c unicode-utf8 RET C-x C-f filename RET を実行します。 (Mule-UCS が好みであれば、unicode-utf8 のかわりに utf-8 を実行します) shell バッファを UTF-8 I/O で実行するには、下記を実行します。 M-x universal-coding-system-argument utf-8 RET M-x shell RET (Mule-UCS のみで動作します) 上記は Emacs がターミナルモードではなく、ウィンドウモードの時のみ動作 します。 Richard Stallman は将来的に UTF-8 サポートを Emacs に統合しようと計画 しています。同じく XEmacs 開発グループもです。 関連文書: のページ "Multilingual Emacs and Unicode" http://www.geocities.com/ResearchTriangle/Campus/6475/index.html 5.3.5. xemacs (このセクションは Gilbert Baumann が書きました) これは Xemacs(のバージョン 20.4 に MULE を設定(configured)した) で UTF-8 エンコードを扱えるようにする方法です。残念ながらソースにパッチを あてる必要があります。 始めに Tomohiko Morioka による、これらのファイルが必要になります。 http://turnbull.sk.tsukuba.ac.jp/Tools/XEmacs/xemacs-21.0-b55-emc- b55-ucs.diff および http://turnbull.sk.tsukuba.ac.jp/Tools/XEmacs/xemacs-ucs- conv-0.1.tar.gz diff ファイルは C のソースの差分です。tar 玉は elisp のコードで、 Unicode との相互変換のための多くのコードテーブルを提供します。diff ファイルの名前からわかるようにこれは XEmacs-21 用ですから、私が使って いる XEmacs-20.4 では多少パッチを修正する必要がありました。XEmacs-20.4 のソースとの最も大きな違いは file-coding.[ch] が mule-coding.[ch] と なっていたことです。(訳注:tarball(tar 玉や tar ボールと呼ばれま す)は、tar で固められたファイルのことです) (私のように) XEmacs-MULE に慣れていない方へのクイックガイドです: MULE ではエンコーディングを `coding-system' と呼びます。最も重要なコマ ンドは、 M-x set-file-coding-system M-x set-buffer-process-coding-system [comint buffers] と、使用されているエンコーディングを調べる時に `find-file' 関数が使用 する変数 `file-coding-system-alist' です。実行後にすぐに私が行なったの はこれ です。 このコードはオープンしようとしているファイルの先頭 600 バイトまで、-*- で始まっている special mode line を探します。"Encoding: xyz;" フィール ドがあり、xyz エンコーディング(Emacs では "coding system" ですね)が存 在してた場合には、このようにして XEmacs を utf-8 モードにすることがで きます。 ;;; -*- Mode: Lisp; Syntax: Common-Lisp; Package: CLEX; Encoding: utf-8; -*- 全てがうまく動作したあと、\u03BB(ギリシャ語のラムダ) というマクロを定 義しました。 (defmacro \u03BB (x) `(lambda .,x)) 5.3.6. nedit (工事中) 5.3.7. xedit 理論上は xedit はロケールを適切に設定し(上記を参照)、$HOME/.Xdefaults ファイルに "Xedit*international: true" 行を追加すれば UTF-8 ファイルを 編集できるはずですが、実際には UTF-8 エンコーディングされた非 ASCII 文 字を認識してはいますが、連続した "@" 文字で表示されてしまいます。 5.3.8. axe ロケールを適切に設定し(上記を参照)、$HOME/.Xdefaults ファイルに "Axe*international: true" 行を追加すれば、理論上 axe は UTF-8 ファイル を編集できるはずですが、実際には単に core を吐くだけです。 5.3.9. pico (工事中) 5.4. メーラ MIME: RFC 2279 は UTF-8 を MIME 文字セットとして定義しています。 MIME は 8 ビットの表示可能な base64 エンコーディングで転送することができま す。古い MIME UTF-7 プロポーザル(RFC 2152)は反対されている(deprecated) ため、使用するべきではありません。 1999 年 1 月 1 日以降にリリースされたメールクライアントは UTF-8 エンコ ードされたメールの送信や表示を行えるはずです。もし扱えない場合には欠陥 (deficient)と思われます。ですがこれらのメールは MIME ラベルである以下 の行を含む必要があります。 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MIME ラベルなしで、UTF-8 ファイルを単純に "mail" コマンドにパイプで渡 した場合には、正しく扱われません。 メールクライアントの実装者は http://www.imc.org/imc-intl/ や http://www.imc.org/mail-i18n.html に目を通すべきです。 これから個々のメールクライアント(もしくは "mail user agents"(MUA)と呼 びます) について見ていきます。 5.4.1. pine パッチのあたっていない pine version 4.10 のはこのようになっています。 Pine は文字セットのコンバートを行いませんが、UTF-8 のテキストウィンド ウ (Linux コンソールか xterm)で UTF-8 のメールを閲覧することができま す。 通常 Pine は UTF-8 エンコードされたメールを閲覧するたびに、文字セット が異なっていると警告をします。この警告を出さないようにするには S(setup)を選択し、次に C(config)、そして "character-set" の値を UTF-8 に変更します。 Pine は UTF-8 を識別しないため、このオプションは警告表 示を抑制する以外には何も行ないません。 Pine の Unicode 文字の認識は非常に限定されていることにも注意してくださ い。ラテン語やギリシャ語の文字は表示しますが、他の種類の Unicode 文字 は表示しません。 Robert Brady のパッチ http://www.ents.susu.soton.ac.uk/~robert/pine-utf8-0.1.diff は Pine に UTF-8 サポートを追加します。このパッチによりヘッダや本文のデコード、表 示が正常に行われます。このパッチは GNOME の libunicode http://cvs.gnome.org/lxr/source/libunicode/ に依存しています。 しかし多くの場合、アラインメントの問題は解消されていません。メールのリ プライは文字セットのコンバートを正しく行えず、また pico エディターはマ ルチバイト文字を扱えません。 5.4.2. kmail (KDE 1.0 の時点では)kmail は UTF-8 メールをまったくサポートしていませ ん。 5.4.3. Netscape Communicator Netscape Communicator の Messenger は、UTF-8 エンコードされたメールの 送信や表示を行うことができますが、多少の手作業が必要となります。 UTF-8 エンコードされたメールを送信するためには、メールを作成する前に "Compose" ウィンドウを開き、メニューの "View -> Character Set -> Unicode (UTF-8)" を選択します。その後メールの作成、送信を行います。 UTF-8 でエンコードされたメールを受け取った場合、Netscape は残念ながら 正しく UTF-8 で表示しません。メールが UTF-8 でエンコーディングされてい ると表示することすらできません。手動でメニューの "View -> Character Set -> Unicode (UTF-8)" を選択する必要があります。 Netscape は UTF-8 のメールを表示するために別のフォントを使用します。 フォントの設定は "Edit -> Preferences -> Fonts" ダイアログで調整できま すから、 "Unicode" フォントカテゴリーを選択します。 5.4.4. emacs (rmail, vm) (工事中) 5.4.5. mutt mutt-1.0 http://www.mutt.org/ の UTF-8 サポートは原始的なものだけで す。UTF-8 を完全にサポートするための Edmund Grimley Evans のパッチがあ ります。 http://www.rano.demon.co.uk/mutt.html 5.5. テキスト操作 5.5.1. groff 伝統的な Unix テキスト操作システム troff/nroff の GNU 版である groff は UTF-8 でフォーマットされたテキストを出力できます。このためには最新 のスナップショット (http://groff.ffii.org/ の groff-current.tar.gz) で、 `groff -Tlatin1' や `groff -Tascii' の代わりに `groff -Tutf8' を 実行する必要があります。 5.5.2. TeX teTeX 0.9 以降には Omega と呼ばれる、TeX に Unicode への対応を追加した ものがあります。(http://www.gutenberg.eu.org/omega/, ftp://ftp.ens.fr/pub/tex/yannis/omega) さらに utf8-tex-0.1.tar.gz の unicode.tex ファイルを使うと、TeX のソースとして UTF-8 でエンコードさ れたものを扱うことができます。現在、数多くの Unicode 文字がサポートさ れています。 これらの変更点はソースの先頭に次の行を追加し、(`tex'のかわりに) `omega' や (`latex' のかわりに)`lambda' を実行することにより利用するこ とできます。 \ocp\TexUTF=inutf8 \InputTranslation currentfile \TexUTF \input unicode 関連するリンク: http://www.dante.de/projekte/nts/NTS-FAQ.html, ftp://ftp.dante.de/pub/tex/language/chinese/CJK/. 5.6. データーベース 5.6.1. PostgreSQL PostgreSQL 6.4 以降ではオプション --with-mb=UNICODE を指定してバイナリ を作成することができます。 5.7. その他のテキストモードのアプリケーション 5.7.1. less これ http://www.flash.net/~marknu/less/less-346.tar.gz に Robert Brady のパッチ less-346-utf8.diff をあててインスト ールします。そして次に環境変数 LESSCHARSET をセットします。 $ export LESSCHARSET=utf-8 環境変数 LESSKEY をセットしている場合には、その変数が指している lesskey ファイルで LESSCHART を定義していないことを確認してください。 必要に応じて `lesskey' コマンドでファイルの再生成や、LESSKEY 環境変数 の unset を行ってください。 5.7.2. expand, wc GNU textutils-2.0 を入手し、パッチ textutils-2.0.diff をあてて "#define HAVE_MBRTOWC 1", "#define HAVE_FGETWC 1", "#define HAVE_FPUTWC 1" を config.h に追加し、src/Makefile の CFLAGS と LDFLAGS が libutf8 がインストールされているディレクトリを include するようにし てリビルドしてください。 5.7.3. col, colcrt, colrm, column, rev, ul util-linux-2.9y パッケージを入手して configure し、defines.h の ENABLE_WIDECHAR を定義し(訳注:#define ENABLE_WIDECHAR)、lib/widechar.h の "#if 0" を "#if 1" にします。そし て text-utils/Makefile の CFLAGS と LDFLAGS が libutf8 がインストール されているディレクトリを include するようにしてリビルドしてください。 5.7.4. figlet figlet 2.2 には UTF-8 で入力するオプション "figlet -C utf8" がありま す。 5.7.5. kermit シリアル通信用プログラム C-Kermit http://www.columbia.edu/kermit/ のバ ージョン 7.0beta10 以降では、ファイルおよび通信のエンコーディングとし て UTF-8 と UCS-2 を、ターミナルでのエンコーディングとして UTF-8 を使 用することができます。エンコーディングに関するドキュメントは ftp://kermit.columbia.edu/kermit/test/text/ckermit2.txt にあります。 5.8. その他の X11 アプリケーション X11 Xlib の UTF-8 ロケールは現在開発中です。 6. あなたのプログラムで Unicode を扱えるようにする 6.1. C/C++ C 言語の `char' 型は 8 ビットですが、これは扱える最小のサイズだからで す。 6.1.1. 通常のテキストハンドリング 1995 年に ISO/ANSI C standard に追加された修正条項に記述されているの は、 "wide character/ワイド文字" 型である `wchar_t'と、 お よび (それぞれ および で宣言されていま す)にある一連の関数と、`char *' と `wchar_t *' 間の一連の 変換関数 ( で宣言されています)です。 これらの API の良いリファレンス o GNU libc-2.1 マニュアルの 4 章 "Character Handling" と 6 章 "Character Set Handling" o マニュアルman-mbswcs.tar.gz、現在は ftp://ftp.win.tue.nl/pub/linux- local/manpages/man-pages-1.28.tar.gz に含まれています。 o OpenGroup のイントロダクション http://www.unix- systems.org/version2/whatsnew/login_mse.html o OpenGroup の Single Unix specification http://www.UNIX- systems.org/online.html o ISO/IEC 9899:1999 (ISO C 99) standard 採用(adopted)前の n2794 と呼ばれている最新のドラフトは ftp://ftp.csn.net/DMK/sc22wg14/review/ もしくは http://java- tutor.com/docs/c/ o Clive Feather のイントロダクション http://www.lysator.liu.se/c/na1.html o the Dinkumware C library リファレンス http://www.dinkumware.com/htm_cl/ これらの API を使う利点 o ベンダーに依存しない標準です。 o 関数はユーザーのロケールに応じた正しい動作をします。全てのプログラ ムで setlocale(LC_ALL,""); を呼びだす必要があります。 これらの API の欠点 o 呼びだし毎に使用する内部的な状態フラグを保持しているため、いくつか の関数はマルチスレッドセーフではありません。 o どのような時にでも使用できるというロケールデータタイプはありませ ん。つまりこれらの API は、1 つ以上のロケールや文字セットを同時に使 用しなければならない時には、うまく動作しません。 o 多くの OS で、これらの API のサポートは満足いくものではありません。 6.1.1.1. 可搬性(Portability)について `wchar_t' が Unicode で、マルチバイトの文字列 `char *' が UTF-8 でエン コードされているかどうかはプラットフォームや、時にはロカールにも依存し ています。 Single Unix specification では `wchar_t' 型についてこのように述べられ ています: プロセスの全てのワイド文字コードは、固定長のビットで構成され ている。これに対して文字(character)を構成するバイト数は可変 である。文字を表現するバイト(あるいはバイトの並び)は、ワイド 文字コードとして表現することもできる。つまりワイド文字コード により、固定長でテキストデータを扱うことができる。全ビットが ゼロのワイド文字コードはヌルのワイド文字コードで、ワイド文字 の文字列の終りを表す。可搬性のある文字セット (著者注:つまり ASCII) を表現するために使用されるワイド文字の値は、1 文字で 文字を表している時にはその (ASCII での)値に等しくなる。その 他の文字のワイド文字コードはロケールおよび実装に依存する。状 態シフトバイトにはワイド文字コード表現はない。 結論としては、可搬性のあるプログラムでは非 ASCII 文字を文字列のリテラ ルとして使うべきではないということです。つまり Unicode の二重引用符が コード U+201C および U+201D ということを知っていたとしても、C のプログ ラムでは文字列のリテラル L"\u201cHello\u201d, he said" や "\xe2\x80\x9cHello\xe2\x80\x9d, he said" を使用すべきではありません。 そのかわりに GNU gettext を使用して gettext("'Hello', he said") と書 き、メッセージデータベース en.UTF-8.po を作成して "'Hello', he said" を "\u201cHello\u201d, he said" に翻訳します。 以下は各 UNIX における ISO/ANSI C 機能の可搬性を調査したものです。GNU glibc-2.2 はこれら全てをサポートする予定ですが、現在の所は(まだ出てい ないため)以下のもので我慢するしかありません。 GNU glibc-2.0.x, glibc-2.1.x o および があります o wcs/mbs 関数がありますが、fgetwc/fputwc/wprintf はありません o UTF-8 ロケールはありません o mbrtowc は文字コードが 0x80 以上の場合、EILSEQ を返します Solaris 2.7 o および があります o wcs/mbs 関数、fgetwc/fputwc/wprintf 関数、全てあります。 o 次の UTF-8 ロケールがあります: en_US.UTF-8, de.UTF-8, es.UTF-8, fr.UTF-8, it.UTF-8, sv.UTF-8. o mbrtowc は文字コードが 0x80 以上の場合、(-2 ではなく) -1/EILSEQ を返します OSF/1 4.0d o および があります o wcs/mbs 関数、fgetwc/fputwc/wprintf 関数、全てあります o アドオンの universal.utf8@ucs4 ロケールがあります。"man 5 unicode" を参照してください o mbrtowc は UTF-8 を扱えません Irix 6.5 o および があります o wcs/mbs 関数、fgetwc/fputwc 関数はありますが、wprintf はありませ ん o マルチバイトのロケールはありません o mbstate_t のダミーな定義しかありません o mbrtowc がありません HP-UX 11.00 o はありますが、 はありません o wcs/mbs 関数、fgetwc/fputwc 関数はありますが、wprintf はありませ ん o C.utf8 ロケールがあります o mbstate_t がありません o mbrtowc がありません AIX 4.2 o はありますが、 はありません。代わりとして を使います o wcs/mbs 関数、fgetwc/fputwc 関数はありますが、wprintf はありませ ん o 次の UTF-8 ロケールがあります: ET_EE.UTF-8, LT_LT.UTF-8, LV_LV.UTF-8, ZH_CN.UTF-8. o mbstate_t がありません o mbrtowc がありません 以上より、再開可能(restartable)かつマルチスレッドセーフな wcsr/mbsr 関 数を使うことをお勧めします。関数が無いシステム(Irix, HP-UX, AIX)のこと は忘れてしまって、UTF-8 ロケール のプラグイン libutf8_plug.so(下記参照 のこと)を、 wcsr/mbsr 関数を使用したプログラムをコンパイルできるシステ ム(Linux, Solaris, OSF/1)で使用しましょう。 Sun の同様なアドバイスhttp://www.sun.com/software/white-papers/wp- unicode/ の "Internationalized Applications with Unicode" セクションに はこのように書かれています: 正しくアプリケーションを国際化するには、次のガイドラインに沿 う必要がある: 1. Unicode への直接のアクセスは避ける。これはプラットフォーム上の国際 化フレームワークの仕事です 2. POSIX モデルの、マルチバイトおよびワイド文字インターフェースを使用 する 3. 国際化フレームワークの提供する言語および文化依存操作の API のみを呼 びだす 4. コードセット非依存のままにする もし何かの理由で、`wchar_t' が Unicode だとどうしても仮定しなければな らない(例えば一部の Unicode 文字に特別な処理を行ないたい時)ようなコー ドが必要な時には、コードのその部分を is_locale_utf8() の結果を見て動作 するようにするべきです。そうしない場合そのプログラムは、ロケールや他の プラットフォームでの動作の記述でぐちゃぐちゃになってしまうでしょう。 is_locale_utf8 関数は utf8locale.h で宣言され、utf8locale.c で定義され ています。 6.1.1.2. libutf8 ライブラリ ISO/ANSI C API の可搬性のある実装で、8 ビットのロケールと UTF-8 ロケー ルをサポートします。これは libutf8-0.6.2.tar.gz より取得できます。 利点: o Unicode UTF-8 を可搬性のある形でサポートします。マルチバイト文字や ワイド文字をまったくサポートをしていない、もしくは正しく動作しない OS であってもです。 o 8 ビットロケールおよび UTF-8 ロケールをサポートする全ての OS で同一 のバイナリを実行することができます。 o OS ベンダーが適切なマルチバイト文字サポートを追加すれば、それを -DHAVE_LIBUTF8 コンパイルオプションなしで単純に再コンパイルするだけ で利用することができます。 6.1.1.3. Plan9 の場合 Unix の一種である Plan9 オペレーティングシステムは、全てのアプリケー ションの文字エンコーディングとして UTF-8 を使用しています。ワイド文字 型は `wchar_t' ではなく、`Rune' です。Rob Pike と Howard Trickey が書 いたライブラリは ftp://ftp.cdrom.com/pub/netlib/research/9libs/9libs-1.0.tar.gz にあり ます。Alistair G. Crooks の書いたその他の同様なライブラリは ftp://ftp.cdrom.com/pub/NetBSD/packages/distfiles/libutf-2.10.tar.gz です。これらのライブラリには UTF-8 を扱える正規表現があります。 この API の欠点: o UTF-8(サポート)はオプションではなく、コンパイル時に含まれてしまいま す。これによりプログラムは、ヨーロッパでまだ数多く使用されている 8 ビットエンコーディングをサポートできません。 6.1.2. GUI 用には Qt-2.0 ライブラリ http://www.troll.no/ には、Unicode に完全対応した QString クラスがあります。UTF-8 でエンコードされたテキストとの相互変換 には、メンバ関数の QString::utf8 および QString::fromUtf8 を使うことが できます。 QString::ascii および QString::latin1 メンバ関数はもはや使 うべきではありません。 6.1.3. 先進的なテキスト操作 これまでに述べたライブラリは、ASCII を扱えるものを Unicode を扱えるよ うにしたバージョンです。ここで述べるのは titlecase(単語の始まりを大文 字にすること、またはその反対)、句読点と記号の区別、標準的な分かち書き (decomposition)、結合を行うクラス、標準的なソートといった機能を Unicode で扱えるライブラリです。 ucdata-2.3 Mark Leisher の ucdata library http://crl.nmsu.edu/~mleisher/ucdata.html には、文字のプロパ ティ、大文字と小文字の変換、分かち書き(decomposition)、結合を行 うクラスがあります。 ICU IBM の Unicode クラス(IBMs Classes for Unicode) http://www.alphaworks.ibm.com/tech/icu/ です。総合的な国際化ライ ブラリで、Unicode の文字列、リソースバンドル、数値のフォーマッ タ、日付/時間のフォーマッタ、メッセージフォーマッタ、照合などの 機能があります。多くのロケールがサポートされており、Unix と Win32 の間で可搬性がありますが、そのままでは Linux の libc6 上で しかコンパイルできません(libc5 では駄目です)。 libunicode Tom Tromey 達による、GNOME libunicode library http://cvs.gnome.org/lxr/source/libunicode/ です。これには文字 セットのコンバート、文字のプロパティ、分かち書 き(decomposition)の機能があります。 6.1.4. 変換用には 2 種類の変換ライブラリがあります。これは UTF-8 や、多くの 8 ビット文字 セットをサポートしています。 6.1.4.1. iconv GNU glibc-2.1.1 に含まれている、Ulrich Drepper による iconv の実装 ftp://ftp.gnu.org/pub/gnu/glibc/glibc-2.1.1.tar.gz Bruno Haible による可搬性のある iconv ftp://ftp.ilog.fr/pub/Users/haible/gnu/libiconv-1.1.tar.gz Konstantin Chuguev による可搬性のある iconv ftp://ftp.urc.ac.ru/pub/local/OS/Unix/converters/iconv-0.4.tar.gz 利点: o iconv は POSIX 標準であり、iconv を使用して UTF-8 との相互変換を行 うプログラムは Solaris でも動作します。ただし文字セットの名前はプ ラットフォーム間で異なっています。例えば glibc では "EUC-JP" です が、HP-UX では "eucJP" になっています(この文字セットの公式な IANA での名前は "EUC-JP" ですから、明らかに HP-UX が間違っています)。 o glibc-2.1 では他にライブラリを必要としません。その他の環境で は、Bruno Haible や Konstantin Chuguev の実装した iconv を使用する ことができます。 6.1.4.2. librecode Francois Pinard の librecode ftp://ftp.gnu.org/pub/gnu/recode/recode-3.5.tar.gz 利点: o 字訳(transliteration)をサポートしています。これは非 ASCII 文字を ASCII 文字へと、欠落のない(lossless)変換が不可能な場合であっても人 間が読める形にコンバートします。 欠点: o 標準外(non-standard) な API o 初期化が遅い 6.1.5. その他のアプローチ libutf-8 G. Adam Stanislav の libutf-8 には UTF-8 エンコードされた `FILE*' ストリームとの相互変換を動的に行なうい くつかの関数があります。 http://www.whizkidtech.net/i18n/libutf-8-1.0.tar.gz 利点: o 非常に小さい 欠点: o 標準外(non-standard) な API o UTF-8 はオプションではなくコンパイル時に含まれてしまいます。これ により、このライブラリとコンパイルされたプログラムは 8 ビットの エンコーディングをサポートしません。こういったプログラムはヨー ロッパではまだ数多く使用されています。 o インストールは簡単ではありません。autoconfig されないた め、Makefile をいじる必要があります。 6.2. Java Java は言語自体が Unicode をサポートします。`char' 型は Unicode 文字を 表し、また `java.lang.String' クラスは Unicode の文字列を扱えます。 Java はどんな Unicode 文字でも、自身のウィンドウシステム AWT を使用し て表示することができます。このために必要なことは、 1. Java のシステム プロパティ "user.language" を適切なものにセットする。 2. /usr/lib/java/lib/font.properties.language フォントセットの定義を適切 なものにセットする。 3. 上記で指定したフォントをインストールする。例え ば日本語の文字を含むテキストを表示するには、日本語のフォントをインスト ールし、"java - Duser.language=ja ..." で実行します。フォントセットを 組み合わせることもできます:西ヨーロッパ、ギリシャ、日本語の文字を同時 に表示するには、 "font.properties" (ISO-8859-1 をカバ ー)、"font.properties.el" (ISO-8859-7 をカバー)、"font.properties.ja" ファイルを組み合わせたものを作成します。??This is untested?? java.io.DataInput および java.io.DataOutput インターフェースにはそれぞ れ、 `readUTF' や `writeUTF' というメソッドがありますが、これらは UTF-8 を使用しないことに注意してください。これらは変更された UTF-8 を 使用します: NUL 文字は 0x00 のかわりに 2 バイトの 0xC0 0x80 としてエ ンコードされ、末尾に 0x00 バイトが追加されます。このようにエンコードさ れるため、文字列はフィールドの長さを持たなくとも、NUL 文字を含むことが できます。C では の strlen() や strcpy() といった関数でその ような NUL 文字を含んだ文字列を扱うことができます。 6.3. Lisp Common Lisp 標準では `base-char' と `character' の 2 種類の文字列型を 定義しています。Unicode をサポートするかどうかは実装に依存します。文字 セットやエンコーディングを指定するためには、引数として `:external- format' を指定し、`open' で定義します。 フリーの(訳注:無料ではなく、自由という意味です) Common Lisp の実装で は、 CLISP http://clisp.cons.org/ だけが Unicode をサポートしています が、そのためには CLISP の 1999年 7月以降のバージョン ftp://clisp.cons.org/pub/lisp/clisp/source/clispsrc.tar.gz が必要とな ります。`base-char'型 および `character' 型はどちらも 16-bit Unicode と同等です。ファイル、ソケット、パイプの I/O に使用されるエンコーディ ングは `:external-format' 引数で指定することができます。ファイル、ソ ケット、パイプの I/O のデフォルトのエンコーディングおよび tty I/O に使 用されたエンコーディングはロケールに依存しています。 商用の Common Lisp の実装では、Eclipse http://www.elwood.com/eclipse/eclipse.htm だけが Unicode をサポートし ます。http://www.elwood.com/eclipse/char.htm を参照してください。 `base-char' 型は ISO-8859-1 と同等であり、また `character' 型は全ての Unicode 文字を含むことができます。ファイルの I/O に使用されるエンコー ディングの指定は `:element-type' および `:external-format' 引数で `open' を指定することにより可能です。制限事項: 文字属性(character attribute attribute) 関数はロケールに依存しています。ソースおよびコン パイルされたソースファイルは Unicode の文字列でのリテラルを扱うことが できません。 商用の Common Lisp の実装である Allegro CL はまだ Unicode をサポートし ませんが、Erik Naggum が現在作業中です。 6.4. Ada95 Ada95 は Unicode をサポートするためにデザインされました。Ada95 の標準 ライブラリの機能には、ISO 10646-1 のための特別なデータ型である Wide_Character および Wide_String があります。これらに関連する多数のプ ロシージャや関数も同様です。GNU Ada95 コンパイラ(gnat-3.11 以降)は UTF-8 をワイド文字の外部エンコーディングとしてサポートします。これによ り、UTF-8 をソースコードとアプリケーションの I/O として使用することが できます。アプリケーションでも使用できるようにするにはファイルをオープ ンする時に FORM 文字列 に "WCEM=8" をセットし、またソースコードが UTF-8 ならコンパイラオプション "-gnatW8" を使用します。詳しくは GNAT および Ada95 のリファレンスマニュアルを参照してください。 7. 他の情報源 7.1. メーリングリスト 以下のメーリングリストには、多くの人がいます。 7.1.1. linux-utf8 アドレス: linux-utf8@nl.linux.org このメーリングリストは Unicode による国際化についてです。キーボードド ライバから X11 のフォントまで、幅広いトピックについて話されています。 アーカイブは http://mail.nl.linux.org/linux-utf8/ にあります。 講読(subscribe)するには majordomo@nl.linux.org へ、本文に "subscribe linux-utf8" と書いて送信します。 7.1.2. li18nux アドレス: linux-i18nsun.com このメーリングリストは Linux における国際化作業の組織編成や会合の打ち 合わせについてです。 講読(subscribe)するには http://www.li18nux.org/ でフォームに記述して linux-i18n-request@sun.com へ送信します。 7.1.3. unicode アドレス: unicode@unicode.org このメーリングリストは Unicode の標準化、開発、Bidi やソートのアルゴリ ズムといった関連する技術について話されています。 アーカイブは ftp://ftp.unicode.org/Public/MailArchive/ にありますが、 定期的にアップデートはされてはいません。 講読するには http://www.unicode.org/unicode/consortium/distlist.html を御覧ください。 7.1.4. X11 国際化 アドレス: i18n@xfree86.org このメーリングリストは、X11/XFree86 システムの国際化の作業者向けのもの です。 アーカイブは http://devel.xfree86.org/archives/i18n/ にあります。 講読するには、i18n-request@xfree86.org (恐い人じゃないです) にメールし て、動機を説明してください。 7.1.5. X11 フォント アドレス: fonts@xfree86.org このメーリングリストは Unicode フォントや、X11/XFree86 システム用の フォントサブシステムの開発者向けのものです。 アーカイブは http://devel.xfree86.org/archives/fonts/ にあります。 講読するには fonts-request@xfree86.org にいるオーバーワークの人にメー ルして、動機を説明しましょう。