Scroll to navigation

UNICODE(7) Linux Programmer's Manual UNICODE(7)

名前

Unicode - 汎用文字集合

説明

国際規格 ISO 10646汎用文字集合 (Universal Character Set (UCS)) を定義している。 UCS は他規格の文字集合の文字を全て含んでいる。 さらに、 双方向の互換性 (round-trip compatibility) を保証する。 例えば他の符号から UCS に変換しさらに元の符号に変換したとしても、 何の情報も失なわれないように変換テーブルを作成することができる。

UCS は現実的に知られている全ての言語を表現するのに必要な文字を含んでいる。 これにはラテン文字、ギリシャ文字、キリル文字、ヘブライ文字、アラビア文字、 アルメニア文字、グルジア文字だけでなく、中国・日本・韓国で使われている漢字、 さらには、平仮名、片仮名、ハングル文字、 デーヴァナーガリー文字、ベンガル文字、グルムキー文字、グジャラート文字、 オリヤー文字、タミール文字、テルグ文字、カナラ文字、マラヤーラム文字、 タイ文字、ラオス文字、クメール文字、ボポモフォ文字 (注音字母)、 チベット文字、ルーン文字、エチオピア文字、カナダ音節文字、 チェロキー文字、モンゴル文字、 オガム文字、ミャンマー文字、シンハラ文字、 ターナ文字、イ (彝) 文字などが含まれる。 まだカバーされていない文字に付いても、 コンピュータで使用するために どのようなエンコードがもっとも良いかという研究が進められており、 最終的には追加されるだろう。 ヒエログリフや歴史的ないろいろなインド=ヨーロッパ言語だけでなく、 テングワール文字、キアス文字、クリンゴン文字などの人工的な言語も選ばれている。 UCS は、これらの文字に加えて、TeX, PostScript, APL, MS-DOS, MS-Windows, Macintosh, OCR フォント、数多くのワードプロセッサーや 出版システム、などが提供する 図形記号・印字記号・数学記号・科学記号などの多くを含むようになった。

UCS 規格 (ISO 10646) は 31ビットの文字集合アーキテクチャー を記述しており、 128 個の 24 ビット 群 (group) から構成されている。 各群は 256 個の 16 ビット 面 (plane) に分割されており、 各文字は 256 個の 8 ビット 区 (row) の 256 点 (column) の中に位置する。 この規格の Part 1 (ISO 10646-1) では、 最初の 65534 個のコード位置 (0x0000 〜 0xfffd) を定義している。 これは第 0 群の第 0 面である 基本多言語面 (Basic Multilingual Plane (BMP)) を構成する。 この規格の Part 2 (ISO 10646-2) では、第 0 群の BMP の外部である 0x10000 〜 0x10ffff の範囲にある 補助面 (supplementary planes) に文字を追加した。 この規格では 0x10ffff を越えた位置に文字を追加する予定はないので、 予想できる将来においては、 全コード空間のうちグループ 0 の一部分は実際には使われることはない。 BMP には他の文字集合で一般に使われる全ての文字が含まれている。 ISO 10646-2 で追加された補助面は、 特定の科学分野・辞書出版・印刷産業・高次プロトコル・ 何かのファンの間などで使われる特殊な文字だけをカバーする。

UCS 文字を 2 バイトのワードで表現するのが UCS-2 形式である (BMP 文字のみ)。 また、UCS-4 では文字を 4 バイトのワードで表現する。 さらに、ASCII を処理するソフトウェアへの下位互換のために UTF-8 エンコード形式がある。 また、0x10ffff までの非 BMP 文字を扱う UCS-2 対応ソフトウェアとの互換のために UTF-16 エンコード形式がある。

UCS 文字集合の 0x0000 から 0x007f は、古典的な US-ASCII 文字集合の文字と同じである。 また 0x0000 から 0x00ff の範囲では、ISO 8859-1 Latin-1 文字集合の文字と同じである。

合成文字 (Combining characters)

UCS のいくつかのコード・ポイントは 合成文字 (combining characters) に割り当てられている。 これらはタイプライターの移動しないアクセント・キーに似ている。 合成文字は直前の文字にアクセントのみを加える。 最も重要なアクセント付きの文字はそれ自身のコードを UCS に持っている。 一方で合成文字機構は全ての文字にアクセントや発音区別符号を加えることができる。 合成文字は常にそれが修正する文字に続く。 例えばドイツ語の文字 A ウムラウト ("Latin capital letter A with diaeresis") は UCS に前もって準備されたコード 0x00c4 でも、 通常の A "Latin capital letter A" に "combining diaeresis (合成分音記号)" を続けた組合せ (0x0041 0x0308) のどちらでも表現することができる。

合成文字は、タイ文字や数学植字のエンコード・ 国際音声字母を使うユーザーなどには必須である。

実装レベル

全てのシステムに合成文字のような進んだサポートを期待しているわけではない。 ISO 10646-1 は以下の三段階の UCS の 実装レベル を指定している。

合成文字と ハングル・ジャモ文字 (いろいろな韓国・朝鮮文字の符号化。 この符号化では、ハングル音節のグリフが 3 つまたは 2 つの母音・子音コードの組み合わせで符号化される) はサポートしない。
Level 1 と同様だが、合成文字を必須とする言語のための文字 (例えば、タイ文字・ラオス文字・ヘブライ文字・アラビア文字・ デーヴァナーガリー文字・マレヤーラム文字) は使える。
全ての UCS 文字をサポートする。

ユニコード・コンソーシアム (Unicode Consortium) から発行された Unicode 3.0 Standard は、ISO 10646-1:2000 に記述された UCS Basic Multilingual Plane の level 3 実装と全く同じである。 Unicode 3.1 では ISO 10646-2 の補助面が追加されている。 Unicode Consortium から発行される Unicode 規格と技術レポートにより、 いろいろな文字の意味と推奨される使用法についての更なる情報が得られる。 これらの規格書や技術レポートで、Unicode 文字列を 編集・並べ替え・比較・正規化・変換・表示するための ガイドラインとアルゴリズムが分かる。

Linux における Unicode

GNU/Linux では、C 言語の型 wchar_t は符号付き 32 ビット整数型である。 その値は C ライブラリにより (すべてのロケールにおいて) 常に UCS コードの値として解釈される。 これを GNU C ライブラリがアプリケーションに知らせるための規約として、 定数 __STDC_ISO_10646__ を定義する。 これは ISO C99 規格で指定されている。

ASCII 互換の UTF-8 マルチバイトエンコードでは、入出力ストリーム・端末通信・ プレーンテキストファイル・ファイル名・環境変数において、 UCS/Unicode を ASCII のように使うことができる。 UTF-8 を文字エンコードとして使うことを 全てのアプリケーションに知らせるためには、 ("LANG=en_GB.UTF-8" のように) 環境変数を使って適切な ロケール (locale) を選択しなければならない。

nl_langinfo(CODESET) 関数は選択されたエンコードの名前を返す。 内部的な wchar_t 文字や文字列をシステム文字列エンコードに変換 (逆変換) するのに使われる wctomb(3)mbsrtowcs(3)、さらには wcwidth(3) といったライブラリ関数は、 文字出力でどれだけカーソルが進んだか (0–2) を返す。

一般的に言うと、Linux では現在のところ BMP の level 1 実装のみを使うべきである。 ある言語の文字 (とくにタイ文字) では、ベース文字当たり 2 つまでの合成文字を使うことが UTF-8 端末エミュレータと ISO 10646 フォント (level 2) でサポートされている。 しかし一般的に言えば、もし可能ならばあらかじめ合成した文字を使うべきである (Unicode では、これを Normalization Form C (合成文字の正規化形式) という)。

プライベート・エリア

BMP の 0xe000 〜 0xf8ff の範囲は、規格ではいかなる文字も割り当てず、 私的な使用のために予約されている。 Linux コミュニティでは、 このプライベート・エリアをさらに細かく分割して使用する。 0xe000 〜 0xefff の範囲はエンド・ユーザーが個々に使用することができる。 0xf000 〜 0xf8ff の範囲は Linux Zone で 全ての Linux ユーザーで共通に使用する。 Linux Zone への文字割り当ての登録は、 現在 H. Peter Anvin <Peter.Anvin@linux.org> によって管理されている。

文献

*
Information technology — Universal Multiple-Octet Coded Character Set (UCS) — Part 1: Architecture and Basic Multilingual Plane. International Standard ISO/IEC 10646-1, International Organization for Standardization, Geneva, 2000.

これは UCS の公式な仕様である。 http://www.iso.ch/ から注文できる CD-ROM で PDF ファイルとして入手できる。

*
The Unicode Standard, Version 3.0. The Unicode Consortium, Addison-Wesley, Reading, MA, 2000, ISBN 0-201-61633-5.
*
S. Harbison, G. Steele. C: A Reference Manual. Fourth edition, Prentice Hall, Englewood Cliffs, 1995, ISBN 0-13-326224-3.

C プログラム言語についてのとても良い参考書である。 第四版では、ワイド文字やマルチバイト文字エンコードを扱うための 多くの新しい C ライブラリ関数が 加えられた ISO C90 規格の 1994 Amendment 1 をカバーしている。 しかし、ワイド文字やマルチバイト文字のサポートを 更に改善した ISO C99 は、まだカバーしていない。

*
Unicode 技術レポート。
*
Markus Kuhn: UNIX/Linux のための UTF-8 と Unicode の FAQ。
http://www.cl.cam.ac.uk/~mgk25/unicode.html

linux-utf8 メーリングリストを購読するための情報がある。 Linux で Unicode を使う場合のアドバイスを探すのに一番良い場所である。

*
Bruno Haible: Unicode HOWTO.

バグ

このマニュアルページを最後に改訂した時点で、 GNU C ライブラリの UTF-8 サポートは完成している。 XFree86 によるサポートは進行中である。 UTF-8 ロケールで快適に使えるアプリケーション (多くの有名なエディタ) の作成は、まだ進行中である。 Linux での UCS サポートでは通常 CJK の 2 ワイド文字が提供される。 単純な重ね打ちによる合成文字が提供される場合もある。 しかし、右から左へ書く文字やヘブライ文字・アラビア文字・インド語系文字などの 合字の置き換えを必要とする文字はサポートされていない。 現在、これらの文字は洗練されたテキスト描画エンジンを備えた GUI アプリケーション (HTML ビューア・ワードプロセッサ) でのみ サポートされている。

関連項目

setlocale(3), charsets(7), utf-8(7)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。

2012-08-05 GNU