charsets -
文字集合の標準と国際化
このマニュアルページでは、
様々な文字集合標準の概要と、
Unicode
が広く使われるようになる前にこれらの文字集合が
Linux
でどのように使われていたかを説明する。
この情報の中には、以前からあるシステムやドキュメントを扱う人々にとっては今も役立つことだろう。
ここで扱う標準としては
ASCII, GB 2312, ISO 8859, JIS, KOI8-R, KS, Unicode
がある。
主な対象はロケール文字集合で実際に使用されていた文字集合についてであり、他のシステムで作成されたデータで使われていた無数の他の文字集合についてではない。
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 は 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 は、 Unicode
の前に、ロシアにおいてよく用いられた
ISO
でない文字集合である。
下位半分は ASCII
である。上位半分は ISO
8859-5
よりいくらかよく設計されたキリル文字集合である。
KOI8-U は KOI8-R
を元にしており、
ウクライナ語 (Ukrainian)
への対応がより良いものになっている。
これらの文字集合はどちらも、
ISO 8859 系列とは違い、 ISO-2022
との互換性はない。
Linux での KOI8-R
のコンソールサポートは、
ユーザーモードのユーティリティで実現されている。
これはキーボードの割り当てと
EGA
グラフィックテーブルを変更し、
コンソールドライバのフォントテーブルに
"ユーザー割り当て"
を行う。
GB 2312
は、簡体文字を表現するための中国の国定標準文字セットである。
JIS X 0208 と同様に、文字は
94x94 の 2
バイトマトリックスに配置され、
EUC-CN に用いられる。 EUC-CN
は Linux
において最も重要なエンコーディングであり、
ASCII と GB 2312
を含んでいる。 EUC-CN
はしばしば GB, GB 2312, CN-GN
などと呼ばれる。
Big5
は台湾で繁体文字を記述するのに一般的に使われる文字セットであった。
(Big5
は文字セットとエンコーディングの両方である。)
これは US ASCII
の上位集合である。
非 ASCII 文字は 2
バイトで表現する。
0xa1–0xfe のバイトは 2
バイト文字の 1
文字目として用いる。
Big5
とその拡張は台湾と香港で広く用いられていた。
これは ISO 2022
準拠ではない。
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
は韓国の国定標準文字セットである。
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 と 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
はタイの国定標準文字セットで、
ASCII の上位集合である。
ISO 8859
系列と同様に、タイ文字は
0xa1–0xfe に配置される。
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/
に書かれている。