CHARSETS(4)

名前
キャラクタセット - プログラマの視点から見たキャラクタセットと国際化

説明
Linux は国際化されたオペレーティングシステムである。Linux の様々なユーティ リティや(console ドライバを含む)デバイスドライバは発音マーク (diacritical marks)、アクセント、連結文字 (ligatures) などの付いたラテ ンアルファベット文字 (Latin-alphabet letters)やギリシャ文字、キリル文 字、アラビア文字、ヘブライ文字などを含む、非ラテンアルファベットなどの マルチリンガル文字セット(multilingual character sets)をサポートしてい る。

このマニュアルページはプログラマの視点からみた、異なる文字集合規格 (character-set standards) とそれらを Linux にどう適合させるかというこ とについて述べる。ここでは、ASCII, ISO8859, KOI8-R, Unicode, ISO 2022, ISO 4873 の各規格について議論する。

ASCII
ASCII (American Standard Code For Information) は 7-bit 文字集合の元 となったものであり、もともとは米語(American English) のためにデザイン された。現在は、ECMA-6 標準の中で説明されている。

イギリスにおいては、アメリカの ハッシュ記号(＃)をブリティッシュ・ポンド 記号(£)で置き換えた ASCII の変種が使われる。このアメリカとイギリスの変種を 区別する必要がある場合は、"US ASCII" と "UK ASCII" と呼ぶ。

Linux は US でデザインされたハードウェアのために書かれた、したがって、 はじめから US ASCII をサポートしている。

ISO8859
ISO 8859 は 10 組の一連の 8-bit 文字集合である。それらは全て 下位 (7-bit) に US ASCII を含み、 128 から 159 には制御文字が配置され、 160 から 255 には 96 個の固定幅図形文字が配置されている。

これらのうちで、もっとも重要なのは ISO 8859-1 (Latin-1) である。これ は Linux コンソールドライバにおいて始めからサポート(natively supported)されており、X11R6 においても同様にサポートされている。さら に、HTML の基本文字集合である。

コンソールにおける、その他の 8859 文字集合のサポートは ( setfont(8) ) のようなユーザモード・ユーティリティを利用する事で可能になる。 このようなユーティリティを利用することにより、コンソールドライバにおけ るキーボードと EGA グラフィックテーブルの割り当てを変更し、"ユーザ割 り当て(user mapping)"フォントテーブルを使用することができる。

以下は、それぞれの集合の簡単な説明である。

8859-1 (Latin-1)
    Latin-1 は アルバニア語(Albanian)、カタロニア語(Catalan)、デンマーク語 (Danish)、オランダ語(Dutch)、英語(English)、フェロー語(Faroese)、 フィンランド語(Finnish)、フランス語(French)、ドイツ語(German)、ガリシ ア語(Galician)、アイルランド語(Irish)、アイスランド語(Icelandic)、イタ リア語(Italian)、ノルウェー語(Norwegian)、ポルトガル語(Portuguese)、ス ペイン語(Spanish)、スウェーデン語(Swedish)といったほとんどの西ヨーロッ パ言語をカバーする。

8859-2 (Latin-2)
    Latin-2 はスラヴ語(Slavic)、チェコ 語(Czech)、ドイツ語(German)、ハンガリー語(Hungarian)、ポーランド語 (Polish)、ルーマニア語(Rumanian)、クロアチア語(Croatian)、スロヴァキア 語(Slovak)、スロベニア語(Slovene)といった、書き文字としてラテン文字を 使用する、スラブ系言語と中央ヨーロッパの言語のほとんどをサポートする。

8859-3 (Latin-3)
    Latin-3 はエスペラント(Esperanto)、ガリシア語(Galician)、マルタ語 (Maltese)、トルコ語(Turkish)などの書き手の間で良く用いられる。

8859-4 (Latin-4)
    Latin-4 はエストニア語(Estonian)、ラトビア語(Latvian)、リトアニア語 (Lithuanian)の文字を提供する。Latain-4 は、本 質的には廃止されている(obsolate である)。8859-10 (Latin-6) を参照のこと。

8859-5
    ブルガリア語(Bulgarian)、ベラルーシ語(Byelorussian)、マケドニア語 (Macedonian)、ロシア語(Russian)、セルビア語(Serbian)、ウクライナ語 (Ukrainian) をサポートするキリル文字集合である。 ウクライナ語では downstroke をともなった `ghe' という文字を `heh' と読み、正しい gha を 書くために、upstroke をともなった ghe を必要とする。この点については、 下の KOI8-R に関する議論を参照のこと。

8859-6
    アラビア語(Arabic)をサポートする。8859-6 のグリフテーブル(glyph table) は文字の形態を分割した固定幅フォントである。 そのため、適切なディスプレイエンジンが正しい initial, medial, final フォームに結合しなければならない。

8859-7
    現代ギリシャ語(Modern Greek)をサポートする。

8859-8
    ヘブライ語(Hebrew)をサポートする。

8859-9 (Latin-5)
    これは、Latin-1 の変種で、滅多に使われないアイスランド語の文字をトルコ 語(Turkish)文字に置き換えたものである。

8859-10 (Latin-6)
    Latin-6 は北欧(Nordic)地域をカバーするために Latin-4 には含まれていない イヌイット語(Inuit)(グリーンランド語(Greenlandic)) と ラップ語(Sami (Lappish)) を加えてある。 RFC 1345 には仮の(実際とは)異なった `latin6' が載せられている。スコル ト・ラップ語(Skolt Sami)では、さらにいくつかのアクセント記号が必要であ る。

KOI8-R
KOI8-R はロシアにおいて良く用いられる、ISO でない文字集合であ る。下位半分は US ASCII である。上位半分は ISO 8859-5 より幾分良くデザ インされたキリル文字集合である。

KOI8-R のためのコンソールサポートはコンソールドライバにおいて、キーボー ドの割り当てとEGA グラフィックテーブルを変更し、"ユーザ割り当て" フォ ントテーブルを導入する、ユーザーモード・ユーティリティを用いることによっ て可能になる。

UNICODE
Unicode (ISO10646) は人間が用いる全ての言語の知られている全てのグリフ を明白にあらわすことを目的とした規格である。Unicode のネイティブエンコー ドは 32-bit である(古いバージョンでは 16-bit が用いられていた)。 Unicode についての情報は、<http://www.unicode.com> から得られる。

Linux は 8-bit Unicode トランスファーフォーム(UTF-8) を用いて Unicode をあらわす。 UTF-8 は Unicode の可変長表現である。UTF-8 は 7 bits を符 号化するのに 1 bytes を、 11 bits では 2 bytes を、 16 bites では 3 bytes を、 21 bits では 4 bytes を、 26 bits では 5 bytes を 31 bites では 6 bytes を用いる。

0,1,x をゼロ、１、任意のビットとすると、あるバイト 0xxxxxxx は Unicode では 00000000 0xxxxxxx とあらわされる。これは、ASCII の 0xxxxxxx と同じ シンボルのコードである。このように、ASCII は変更なしに UTF-8 に変換で き、ASCII のみを使う場合は、コードにおいてもファイルサイズにおいても変 更に関して、何も気にとめることはない。

110xxxxx というバイトは 2-byte コードの始まりである、そして、110xxxxx 10yyyyyy は 00000xxx xxyyyyyy というように組み立てられる。また、 1110xxxx は 3-byte コードの始まりであり、1110xxxx 10yyyyyy 10zzzzzz は xxxxyyyy yyzzzzzz というように組み立てられる(UTF-8 が 31 -bit ISO 10646 コードを利用するときは、この行程は 6-byte コードまで発展させられ る)。

ISO-8859-1 のユーザにとって、この事実は、ハイビットセットを使った文字 は二つのバイトに符号化されるということを意味する。このことから (UTF-8 を使うと、ISO-8859-1を使用している)元々のテキストファイルのサイ ズから 1 〜 2 パーセント大きくなってしまうことになる。 しかし、ISO-8859-1 シンボルの Unicode での値は、ISO-8859-1 での値(を 8 個のゼロビットによって伸ばしたもの)と等価であるため、変換による問題は 生じない。 現在 16-bit コードを広く利用している日 本語を利用するユーザには 3 バイトの利用と広大なマッピングテーブルを要 求することになる。そのため、多くの日本人はむしろ ISO 2022 を好む。

UTF-8 は自己同期である。:10xxxxxx は終端であり、ほかのバイトはコードの 先頭である。UTF-8 の文字列における ASCII のバイトは、常にその文字自身を 表現することに注目してほしい。特に、幾つかの大きなコードのパートを形成 するために、NUL や '/' を埋め込む必要はない。

ASCII と NUL と '/' は変更されないため、カーネルは UTF-8 を使用し ていることを特に意識しなくても良い。カーネルはバイトが何をあらわしてい るかに注意する必要がない。

Unicode データ列のレンダリングは典型的には Unicode のサブセッ トからグリフへのマップである`サブフォント(subfont)'テーブルを利用して 行われる。カーネル内部では、Unicode を ビデオ RAM 内部にロードされたサブ フォントとして記述する。これは、UTF-8 モードでは 512 の異なったシンボル を持った文字集合を利用可能であることを意味する。 これは、日本語、中国語、韓国語では十分ではない、しかし、その他の利用で は十分である。

ISO 2022 と ISO 4873
ISO 2022 と 4873 標準は VT100 の動作に基づいたフォントコントロールモデ ルとして述べられている。このモデルは Linux カーネルや xterm(1) において(部分的に)サポートされている。この標準は日本や韓国においてよく 用いられる。

G0, G1, G2, G3 と呼ばれる 4 つの図形文字集合がある。そ れらのうち、一つが最上位ビットが 0 であるコードのための現在の文字集合 (初期値は G0)、一つが最上位ビットが 1 であるコードのための現在 の文字集合(初期値は G1)である。それぞれの図形文字集合は 94 か 96 の文 字を持ち、基本的に 7-bitの文字集合であり、040-0177 (041-0176) か 0240-0377 (0241-0376)のコードを使う。 G0 は常に 94 文字で 041-0176 のコードを使用する。

文字集合の切り替えはシフトファンクション ^N (SO または LS1), ^O (SI または LS0), ESC n (LS2), ESC o (LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC | (LS3R) を使って行われる。 ファンクション LSn は最上位ビットが 0 であるコードのための文字集 合を Gn に設定する。 ファンクション LSnR は最上位ビットが 1 であるコードのためのキャラ クタセットを Gn に設定する。 ファンクション SSn は(最上位ビットの値にかかわらず)次の文字のみ 文字集合を Gn (n=2 または 3)に設定する。

94-文字集合では、エスケープシーケンス ESC ( xx (G0 用), ESC ) xx (G1 用), ESC * xx (G2 用), ESC + xx (G3 用) によって、Gn 文字集合 を用いるように指示される。 xx は "ISO 2375 International Register of Coded Character Sets" で決め られている一文字、または二文字である。 たとえば ESC ( @ は ISO 646 文字集合を G0 として選ぶ、ESC ( A は(ナンバーサイン(＃)の代わりに、ポンド(£)を持つ) UK スタンダード文字 集合を選択する。ESC ( B は(通貨記号のかわりにダラー(＄)を持つ) ASCII を選択する。ESC ( M は アフリカ言語(African languages) を選択し、ESC ( ! A は キューバ語(Cuban)文字集合を選択する。などなど…

96-文字集合では、エスケープシーケンス ESC - xx (G1 用), ESC . xx (G2 用), ECS / xx (G3 用)を用いることで、 Gn 文字集合を使用するように指示される。 例えば、ESC - G はヘブライアルファベット(Hebrew alphabet) を G1 とし て選択する。

マルチバイト文字集合ではエスケープシーケンス E $ xx または ESC $ ( xx (G0 用), ESC $ ) xx (G1 用), ESC $ * xx (G2 用), ESC$ + xx (G3 用) を 用いることで、 Gn 文字集合を使用するように指示される。 例えば、ESC $ ( C は 韓国語(Korean)文字集合を G0 として選択する。 ESC $ B によって選択される日本語文字セットは、より最近のバージョンでは ESC & @ ESC $ B によって選択されるようになった。

ISO 4873 はより制限された文字集合の利用を規定する、その規定で は、G0 は(常に ASCIIに)固定される、従って、G1, G2, G3 は最上位ビットが セットされたコードとしてのみ呼び出すことができる。 特に、^N と ^O は用いられず、ESC ( xx は xx=B としてのみ用いることがで き、ESC ) xx, ESC * xx, ESC + xx はそれぞれ ESC - xx, ESC . xx, ESC / xx と等価になる。

関連項目
console(4), console_ioctl(4), console_codes(4)

翻訳者
石川 睦 <ishikawa@linux.or.jp>