Provided by: manpages-ja_0.5.0.0.20221215+dfsg-1_all
名前
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) を 使って行われる。 ファンクション 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 と等価になる。 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/ に書かれている。