名前

charsets - 文字集合の標準と国際化

説明

このマニュアルページでは、 様々な文字集合標準の概要と、 Unicode が広く使われるようになる前にこれらの文字集合が Linux でどのように使われていたかを説明する。 この情報の中には、以前からあるシステムやドキュメントを扱う人々にとっては今も役立つことだろう。
ここで扱う標準としては ASCII, GB 2312, ISO 8859, JIS, KOI8-R, KS, Unicode がある。
主な対象はロケール文字集合で実際に使用されていた文字集合についてであり、他のシステムで作成されたデータで使われていた無数の他の文字集合についてではない。

ASCII

ASCII (American Standard Code For Information Interchange) は 7 ビット文字集合の元となったものであり、 もともとは米語 (American English) のためにデザインされた。 US-ASCII とも呼ばれる。 現在は、ISO 646:1991 IRV (International Reference Version) 標準で説明されている。
ドイツ語、フランス語、スペイン語などに 7 ビットで対応するため、 ASCII のドル記号を他の通貨記号に置き換え、 句読点を非英語文字のものに置き換えた様々な変種が登場した。 これらはすべて非推奨である。 glibc は ASCII の完全なスーパーセットでない文字セットのロケールに対応していない。
UTF-8 を使う場合、Unicode は ASCII と互換性があるので、 通常の ASCII テキストは新しい UTF-8 を使ったシステムでもそのまま正しく表示することができる。

ISO 8859

ISO 8859 は 15 組の一連の 8 ビット文字集合である。どの文字集合も 下位 (7 ビット) に ASCII を含み、 128 から 159 には制御文字が配置され、 160 から 255 には 96 個の固定幅図形文字が配置されている。
これらのうち、最も重要なのは ISO 8859-1 ("Latin Alphabet No .1" / Latin-1) である。 ISO 8859-1 は広く採用され、様々なシステムでサポートされていたが、 徐々に Unicode で置き換えれている。 ISO 8859-1 文字集合は Unicode の最初の 256 文字でもある。
コンソールにおける、その他の 8859 文字集合のサポートは ( setfont(8)) のようなユーザーモードユーティリティを利用する事で可能になる。 このようなユーティリティを利用することにより、コンソールドライバにおけ るキーボードと EGA グラフィックテーブルの割り当てを変更し、 "ユーザー割り当て(user mapping)"フォントテーブルを使用することができる。
以下は、それぞれの集合の簡単な説明である。
8859-1 (Latin-1)
Latin-1 は アルバニア語 (Albanian)、バスク語 (Basque)、デンマーク語 (Danish)、英語 (English)、フェロー語 (Faroese)、ガリシア語 (Galician)、アイスランド語 (Icelandic)、アイルランド語 (Irish)、イタリア語 (Italian)、ノルウェー語 (Norwegian)、ポルトガル語 (Portuguese)、スペイン語 (Spanish)、スウェーデン語 (Swedish) といった多くの西ヨーロッパ言語をカバーする。 オランダ語の IJ/ij やフランス語の œ といった合字や古いスタイルの „German“ 引用符が欠けている点は以前は許容範囲と考えられていた。
8859-2 (Latin-2)
Latin-2 は、ボスニア語 (Bosnian)、クロアチア語 (Croatian)、チェコ語 (Czech)、ドイツ語 (German)、ハンガリー語 (Hungarian)、ポーランド語 (Polish)、スロヴァキア語 (Slovak)、スロベニア語 (Slovene) といった、 ラテン文字を書き文字として使用する多くの中央、東ヨーロッパの言語をサポートする。 以前は、ルーマニア語の ș/ț を ş/ţ で置き換えるのは許容範囲と考えられていた。
8859-3 (Latin-3)
Latin-3 は、エスペラント語 (Esperanto)、マルタ語 (Maltese)、トルコ語 (Turkish) に対応するために設計されたが、 トルコ語に関しては後に 8859-9 に取って代わられた。
8859-4 (Latin-4)
Latin-4 は、エストニア語 (Estonian)、ラトビア語 (Latvian)、リトアニア語 (Lithuanian) といった北ヨーロッパの言語の文字を提供していたが、 8859-10 と 8859-13 に取って代わられた。
8859-5
ブルガリア語 (Bulgarian)、ベラルーシ語 (Byelorussian)、マケドニア語 (Macedonian)、ロシア語 (Russian)、セルビア語 (Serbian) をサポートし、 ウクライナ語 (Ukrainian) を (ほぼ完全に) サポートするキリル文字集合である。 この文字集合が広く使われたことはなかった。 下の KOI8-R/KOI8-U に関する議論を参照のこと。
8859-6
アラビア語 (Arabic) をサポートするために作成された。 8859-6 のグリフテーブル (glyph table) は文字の形態を分割した固定幅フォントである。 そのため、適切なディスプレイエンジンと組み合わせ、 正しい initial, medial, final フォームに結合しなければならない。
8859-7
現代ギリシャ語用として 1987 年に作成され、 2003 年に更新された。
8859-8
niqud (句読点記号) のない現代ヘブライ語 (Hebrew) をサポートする。 niqud と完全な聖書風ヘブライ語 (Biblical Hebrew) はこの文字セットの対象外である。
8859-9 (Latin-5)
これは、Latin-1 の変種で、アイスランド語の文字をトルコ語(Turkish)文字に 置き換えたものである。
8859-10 (Latin-6)
Latin-6 は、 北欧 (Nordic) 地域を完全にカバーするために Latin-4 には含まれていないイヌイット語 (Inuit) (グリーンランド語 (Greenlandic)) と サーメ語 (Sami) (ラップ語 (Lappish)) を追加していた。
8859-11
タイ語のアルファベットをサポートし、 TIS-620 標準とほとんど同一である。
8859-12
この文字集合は存在しない。
8859-13 (Latin-7)
バルト海諸国の言語をサポートする。 特に、Latin-4 に存在しないラトビア語の文字を含む。
8859-14 (Latin-8)
これは、 ケルト語の文字セットであり、古代アイルランド語 (Old Irish)、マン島語 (Manx)、ゲール語 (Gaelic)、ウェールズ語 (Welsh)、コーンウォール語 (Cornish)、ブルターニュ語 (Breton) に対応する。
8859-15 (Latin-9)
Latin-9 は、広く使用されている Latin-1 に似ているが、 いくつかのあまり使用されないシンボルを、 ユーロ記号と Latin-1 に入っていないフランス語とフィンランド語の文字に置き換えている。
8859-16 (Latin-10)
この文字セットは多くの東南ヨーロッパの言語に対応しており、もっとも重要なのはルーマニア語にはより完全に対応している点である。

KOI8-R / KOI8-U

KOI8-R は、 Unicode の前に、ロシアにおいてよく用いられた ISO でない文字集合である。 下位半分は ASCII である。上位半分は ISO 8859-5 よりいくらかよく設計されたキリル文字集合である。 KOI8-U は KOI8-R を元にしており、 ウクライナ語 (Ukrainian) への対応がより良いものになっている。 これらの文字集合はどちらも、 ISO 8859 系列とは違い、 ISO-2022 との互換性はない。
Linux での KOI8-R のコンソールサポートは、 ユーザーモードのユーティリティで実現されている。 これはキーボードの割り当てと EGA グラフィックテーブルを変更し、 コンソールドライバのフォントテーブルに "ユーザー割り当て" を行う。

GB 2312

GB 2312 は、簡体文字を表現するための中国の国定標準文字セットである。 JIS X 0208 と同様に、文字は 94x94 の 2 バイトマトリックスに配置され、 EUC-CN に用いられる。 EUC-CN は Linux において最も重要なエンコーディングであり、 ASCII と GB 2312 を含んでいる。 EUC-CN はしばしば GB, GB 2312, CN-GN などと呼ばれる。

Big5

Big5 は台湾で繁体文字を記述するのに一般的に使われる文字セットであった。 (Big5 は文字セットとエンコーディングの両方である。) これは US ASCII の上位集合である。 非 ASCII 文字は 2 バイトで表現する。 0xa1–0xfe のバイトは 2 バイト文字の 1 文字目として用いる。 Big5 とその拡張は台湾と香港で広く用いられていた。 これは ISO 2022 準拠ではない。

JIS X 0208

JIS X 0208 は日本語の国定標準文字セットである。 他にもいくつか日本語の国定標準文字セットはある (JIS X 0201, JIS X 0212, JIS X 0213 など) が、これが最も重要である。 文字は 94x94 の 2 バイトマトリックスに配置される。 各バイトは 0x21–0x7e の値を持つ。 JIS X 0208 は文字セットであり、エンコーディングではないことに注意すること。 これは、 JIS X 0208 自身はテキストデータの表現には使われない、ということである。 JIS X 0208 は、 EUC-JP, Shift_JIS, ISO-2022-JP といったエンコーディングを構成する部品として用いられる。 EUC-JP が Linux において最も重要なエンコーディングであり、 ASCII と JIS X 0208 を含んでいる。 EUC-JP では、JIS X 0208 文字は 2 バイトで表現され、 各バイトは JIS X 0208 コードに 0x80 を加えたものである。

KS X 1001

KS X 1001 は韓国の国定標準文字セットである。 JIS X 0208 と同様に、文字は 94x94 の 2 バイトマトリックスに配置される。 KS X 1001 は JIS X 0208 と同様に、 EUC-KR, Johab, ISO-2022-KR といったエンコーディングの部品として用いられる。 EUC-KR は Linux において最も重要なエンコーディングであり、 ASCII と KS X 1001 を含んでいる。 KS C 5601 は KS X 1001 の古い名前である。

ISO 2022 and ISO 4873

ISO 2022 と ISO 4873 標準では、 VT100 の動作に基づいたフォントコントロールモデルが規定されている。 このモデルは Linux カーネルや xterm(1) において (部分的に) サポートされている。 日本語向けなど、ISO-2022 をベースにした文字符号化がいくつか定義されてきた。
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) を使って行われる。 ファンクション LS n は最上位ビットが 0 であるコードのための文字集合を G n に設定する。 ファンクション LS nR は最上位ビットが 1 であるコードのための文字セットを G n に設定する。 ファンクション SS n は(最上位ビットの値にかかわらず)次の文字のみ 文字集合を G n (n=2 または 3)に設定する。
94 文字集合では、エスケープシーケンス ESC ( xx (G0 用), ESC ) xx (G1 用), ESC * xx (G2 用), ESC + xx (G3 用) によって、G n 文字集合 を用いるように指示される。 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 用)を用いることで、 G n 文字集合を使用するように指示される。 例えば、ESC - G はヘブライアルファベット(Hebrew alphabet) を G1 として選択する。
マルチバイト文字集合ではエスケープシーケンス E $ xx または ESC $ ( xx (G0 用), ESC $ ) xx (G1 用), ESC $ * xx (G2 用), ESC$ + xx (G3 用) を 用いることで、 G n 文字集合を使用するように指示される。 例えば、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 と等価になる。

TIS-620

TIS 620 はタイの国定標準文字セットで、 ASCII の上位集合である。 ISO 8859 系列と同様に、タイ文字は 0xa1–0xfe に配置される。

Unicode

Unicode (ISO10646) は、人間が用いる全ての言語の全ての文字を、 明確にあらわすことを目的とした規格である。 Unicode の構造は各文字のエンコードに 20.1 ビットを与えている。 ほとんどのコンピューターは 20.1 ビットの整数を扱えないので、 Unicode は普通内部データとして 32 ビット整数にエンコードされ、 16 ビット整数の列 (UTF-16)(ある種の珍しい文字をエンコードする場合にだけ 2 つの 16 ビット整数が必要となる)か、 8 ビットバイトの列 (UTF-8)として扱われる。
Linux は 8-bit Unicode Transformation Form(UTF-8) を用いて Unicode を あらわす。 UTF-8 は Unicode の可変長表現である。UTF-8 は 7 ビットを 符号化するのに 1 バイトを、 11 ビットでは 2 バイトを、 16 ビットでは 3 バイトを、 21 ビットでは 4 バイトを、 26 ビットでは 5 バイトを、 31 ビットでは 6 バイトを用いる。
0,1,x をゼロ、1、任意のビットとすると、あるバイト 0xxxxxxx は Unicode では 00000000 0xxxxxxx とあらわされる。これは、ASCII の 0xxxxxxx と同じ シンボルのコードである。このように、ASCII は変更なしに UTF-8 に変換でき、 ASCII のみを使う場合は、コードにおいてもファイルサイズにおいても、 変更に関して何も気にしなくてよい。
110xxxxx というバイトは 2 バイトコードの始まりである、そして、110xxxxx 10yyyyyy は 00000xxx xxyyyyyy というように組み立てられる。また、 1110xxxx は 3 バイトコードの始まりであり、1110xxxx 10yyyyyy 10zzzzzz は xxxxyyyy yyzzzzzz というように組み立てられる(UTF-8 が 31 ビット ISO 10646 コードを利用するときは、この工程は 6 バイトコードまで発展させられる)。
ISO 8859 文字集合を使ったほとんどのテキストでは、このことは、ASCII の範囲外を使った文字は二つのバイトに符号化されるということを意味する。 (UTF-8 を使うと、ISO-8859 を使用している) 元々のテキストファイルのサイズから 1 〜 2 パーセント大きくなってしまうことになる。ロシア語やギリシャ語のテキストでは、これによって元のテキストは 2 倍の大きさになることになる。なぜなら、 これらの言語の文字のほとんどが ASCII の範囲外だからである。日本語のユーザーの場合には、現在広く利用されている 16 ビットコードに 3 バイト必要ということだ。いくつかの文字集合 (特に ISO 8859-1) から Unicode への変換はアルゴリズムで行うことができるが、汎用的な変換には変換テーブルが必要であり、 16 ビットコードの場合はこのテーブルはかなり大きなものとなる。
UTF-8 は自己同期的である。10xxxxxx は終端であり、ほかのバイトはコードの 先頭である。UTF-8 の文字列における ASCII のバイトは、常にその文字自身を 表現することに注目してほしい。特に、幾つかの大きなコードのパートを形成 するために、NUL ('\0') や '/' を埋め込む必要はない。
ASCII と NUL と '/' は変更されないため、カーネルは UTF-8 を 使用していることを特に意識しなくても良い。 カーネルはバイトが何をあらわしているかに注意する必要がない。
Unicode データ列のレンダリングは典型的には Unicode のサブセットからグリフへのマップである"サブフォント (subfont)" テーブルを利用して行われる。 カーネル内部では、Unicode を使ってビデオ RAM 内部にロードされたサブフォントを記述している。 これは、 UTF-8 モードの Linux コンソールでは 512 個の異なったシンボルを持った文字集合を利用できることを意味する。 これは、 日本語、中国語、韓国語では十分ではないが、 その他のほとんどの目的では十分である。

関連項目

iconv(1), ascii(7), iso_8859-1(7), unicode(7), utf-8(7)

この文書について

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

Recommended readings

Pages related to charsets you should read also: