日本語文字コードの概略
2019/03/07更新
目次
はじめに
日本語文字コードの世界は、掘り下げれば非常に奥深いものであるが、このページでは、一般的な問題点を考える上で必要となるであろう最低限の基本的知識だけをまとめた。
用語
まず、これ以降の文字コードの話を語る上での基礎的な用語と概念として、以下を押さえておく。
用語 | 意味 |
---|---|
文字集合 | 一定の文字の集まり。例えば「濁点のついた平仮名」や「小文字のアルファベット」などは文字集合である。 |
符号化文字集合 (CCS:Coded Character Set) | 文字集合の各文字に、番号やバイト値などの規則的な符号(コード)を定め、識別できるようにしたもの。 以降で説明するJIS X 0208、JIS X 0213などは、日本語の文字を集めた符号化文字集合である。また、Unicodeは、世界中のあらゆる文字を集めた符号化文字集合である。 |
文字符号化方式 (CES:Character Encoding Scheme) | 符号化文字集合の符号を、コンピュータで扱えるバイト列に変換する方式のこと。それぞれの符号化文字集合には、それに適した文字符号化方式が考案されている。複数の文字符号化方式が使えることもある。 JIS X 0208に対する有名な文字符号化方式としては、Shift_JISやEUC-JPなどがある。また、Unicodeに対しては、UTF-8やUTF-16などがある。 |
文字コード | 文脈によりいろいろな意味を持つ。特定の文字符号化方式、またはそれによって文字に対応付けられたバイト値そのものを指すこともあれば、符号化文字集合と文字符号化方式を組み合わせた概念を指すこともある。 |
日本語の符号化文字集合
最も基本的な符号化文字集合であるASCIIと、日本で制定されたいくつかの日本語の符号化文字集合について述べる。
ASCII
33文字の制御文字と、95文字の図形文字(数字・ラテン文字・記号)に、7ビットの符号0x00~0x7Fを割り当てた符号化文字集合。日本では現在俗に半角英数字と呼ばれているものである。1963年にアメリカで制定された。
コンピュータでは、7ビットの符号値をそのままバイト値として使うため、実質的に文字符号化方式も兼ねている。
JIS X 0201
JIS(日本工業規格)によって定められた最初の日本語の符号化文字集合。「ラテン文字用図形文字集合」(ASCII図形文字とほぼ同じ)と「片仮名用図形文字集合」(ASCIIの8ビット目を立てたコードに片仮名を割り当てたもの。現在俗に半角カナと呼ばれているもの)からなる。
ASCII図形文字とは、「バックスラッシュ」が「円記号」、「チルダ」が「オーバーライン」となっている2点のみが異なる。
JIS X 0208
今日でも使われている、俗にJIS漢字コード、JIS第1・第2水準漢字などと呼ばれる全6,879文字からなる日本語の符号化文字集合。
2バイト符号で、各バイトは0x21~0x7Eまでの94通りの値を取る。これに1~94の番号を対応させ、1バイト目を「区」、2バイト目を「点」と呼んで94×94の区点番号で文字の位置を特定する。例えば、一番最初の文字である「和字間隔(全角スペース)」を表すコード「0x21 0x21」は「1区1点」と言い「01-01」と書く。
主に、1~8区に記号類、平仮名、片仮名、ラテン文字などの漢字以外の文字が収められ、16~47区に第1水準漢字、48~84区に第2水準漢字が収められている。それ以外の区は空き領域となっている(詳細は後述の表を参照)。
JIS X 0208は以下の通り、現在までに何度か改訂が行なわれている。
第1次規格(通称「78JIS」または「旧JIS」)は6,802文字であった。
第2次規格(JIS X 0208-1983、通称「83JIS」または「新JIS」)では、文字の追加、区点位置の入れ替え、漢字の字形変更などが行なわれ、計6,877文字となった。現在JIS X 0208といえば、ほとんどの場合少なくともこの「新JIS」以降を指す。
第3次規格(JIS X 0208-1990、通称「90JIS」)では、第2水準漢字2字が追加され、現在の計6,879文字となった。
第4次規格(JIS X 0208:1997、通称「97JIS」)では、文字の変更は行われず、規定の明確化などが行なわれた。
JIS X 0212
JIS X 0208-1983(新JIS)に収録されていない文字を補うために定められた符号化文字集合。俗にJIS補助漢字と呼ばれる。記号類21文字、アルファベット類245文字、漢字5,801文字の、計6,067文字からなり、JIS X 0208と同じく、94×94の区点で表される。
非漢字は、JIS X 0208の2、6、7、9~11区の空き領域に割り当てられており、JIS X 0208と組み合わせることも可能となっているが、現実にはそのような実装はほとんど存在しないと思われる。後のJIS X 0213の非漢字も同じくJIS X 0208の空き領域に割り当てられており、そちらは現在比較的使われているが、JIS X 0212との互換性は全くない。
一方、漢字は、16~77区に配置されてるため、JIS X 0208と組み合わせることは不可能となっている。これにより区点番号が足りないため、代表的な文字符号化方式であるShift_JISでの符号化ができなくなった。このため、JIS X 0212はあまり普及することがなく、失敗作と言われることもある。ただし、EUC-JPではこの文字集合を取り扱うことが可能となっている。
全ての収録文字は、Unicodeに採用されている。
JIS X 0213
JIS X 0208:1997(97JIS)を拡張した文字集合。JIS X 0208に、非漢字659文字、第3水準漢字1,259文字、第4水準漢字2,436文字の計4,354文字が追加され、全11,233文字からなる。
「JIS X 0208に足りない文字を補充する」という目的はJIS X 0212と同じであるが、JIS X 0212との互換性は全く無い。共通する文字もあれば、どちらか片方だけにしか収録されていない文字も多くある。一方で、JIS X 0213は、JIS X 0208に文字を追加した形の文字集合であるため、JIS X 0208に対しては上位集合となっている。ただし、「包摂」に関するルールなど、一部の互換性は損なわれている。
JIS X 0213では、全ての文字を収録するには区点番号が全く足りないため、既存のJIS X 0208の区点を「1面」とし、新たにもう一つ94×94の区点を持つ「2面」を定義した。そして、1面の空いている位置に非漢字と第3水準漢字、2面に第4水準漢字を配置した。ただし、この時点で1面(JIS X 0208)の空き領域は実際には、外字(各社による独自文字)が定義されていることもあり、そのような規格とは共存できなかった。また、2面のうち、使用されているのは1、3~5、8、12~15、78~94区のみである。これはJIS X 0212が使用した区を避けたためである。これにより、JIS X 0213の2面とJIS X 0212は組み合わせることが可能となっている。
JIS X 0213の文字は、現在では基本的に全てUnicodeで表現可能であるが、UTF-8で4バイト以上となってしまう文字や、2つの文字の合成で表さなければならない文字も存在する。
JIS X 0213は、現在までに以下のような改訂を経ている。
最初に制定されたものはJIS X 0213:2000(通称「JIS2000」)と呼ばれており、11,223文字が定義された。
次に改正されたJIS X 0213:2004(通称「JIS2004」)では、字形変更が行なわれ、「捗」の「少」の点が無くなる、「謎」のしんにゅうが2点になる、「葛」の下の部分がヒからL人になる、「箸」に点が追加される、「鰯」の「弱」の下の点の向きが揃えられる、などなど、細かいが影響は大きく話題となった(これらはそもそも83JISで変更された字形を78JISの字形に戻したものが多い)。また、第3水準漢字が10字加えられ、現在の11,233文字となった。
文字集合の比較
ここまでに説明した、JIS X 0208、JIS X 0212、JIS X 0213、および後述のShift_JISとその拡張で説明しているWindows-31Jが収録している文字の比較を以下の表に示す。
区 | JIS X 0208 | Windows-31J | JIS X 0213 | JIS X 0212 | ||
---|---|---|---|---|---|---|
1面(※2) | 2面 | |||||
01 | 特殊文字、数学記号等(147文字) | 第4水準漢字(94文字) | 未使用 | |||
02 | +記号等(41文字) | 未使用 | 記号等(21文字) | |||
03 | 数字、ラテン文字(62文字) | +記号等(32文字) | 第4水準漢字(282文字) | 未使用 | ||
04 | 平仮名(83文字) | +拡張平仮名(8文字) | ||||
05 | 片仮名(86文字) | +拡張片仮名(8文字) | ||||
06 | ギリシア文字(48文字) | +記号、拡張片仮名等(46文字) | 未使用 | 拡張ラテン文字(47文字) | ||
07 | キリル文字(66文字) | +記号、拡張片仮名等(28文字) | ||||
08 | 罫線素片(32文字) | +記号、丸付き文字、拡張ラテン文字等(52文字) | 第4水準漢字(94文字) | 未使用 | ||
09 | 未使用 | 未使用 | 記号、拡張ラテン文字等(94文字) | 未使用 | 拡張ラテン文字(198文字) | |
10~11 | 拡張ラテン文字(188文字) | |||||
12 | 丸付き文字、ローマ数字等(85文字) | 第4水準漢字(376文字) | 未使用 | |||
13 | NEC特殊文字(丸付き文字、ローマ数字等)(83文字) | 丸付き文字、ローマ数字等(73文字) | +ローマ数字等(4文字) | |||
14~15 | 未使用 | 第3水準漢字(188文字) | ||||
16~46 | 第1水準漢字(2,965文字) | 未使用 | 補助漢字(5,801文字) | |||
47 | +第3水準漢字(43文字) | |||||
48~77 | 第2水準漢字(3,390文字) | |||||
78~83 | 第4水準漢字(1,590文字) | 未使用 | ||||
84 | +第3水準漢字(88文字) | |||||
85~88 | 未使用 | 未使用 | 第3水準漢字(940文字) | |||
89~92 | NEC選定IBM拡張文字(漢字、ローマ数字等)(374文字) | |||||
93~94 | 未使用 | |||||
95~114 | 非対応 | 非対応 | ||||
115~119 | IBM拡張文字(漢字等)(388文字) | |||||
120 | 未使用 |
※1:95~120区は、Shift_JISの余分なコード空間の便宜的な呼び方。Shift_JIS以外ではこの範囲は存在しない。
※2:「+」は、JIS X 0208・Windows-31Jの文字に加えて、空き領域にさらに追加したことを表す。
※3:JIS X 0213の1面13区は、NEC特殊文字のうち、重複していない文字のみを採用している。
※4:JIS X 0212の2区~11区は、JIS X 0208と重ならない位置に配置されている。
ISO-2022-JP
電子メールなどで使われる日本語の文字符号化方式であるISO-2022-JPについて述べる。
ISO-2022とは
ISO-2022-JPを理解するには、まずISO-2022を理解する必要がある。ISO-2022は、ISO/IEC 2022という、ASCIIの上位互換で、複数の文字集合を切り替えながら使うことができる文字符号化方式の規格の一般的な名前である。その中の日本語のサブセットをISO-2022-JPという。
ISO/IEC 2022では、8ビットの範囲を4つの領域に分けて、0x00~0x1FをCL、0x20~0x7FをGL、0x80~0x9FをCR、0xA0~0xFFをGRと呼ぶ。このうち、CLとGLだけを使って7ビット符号とすることも、CRとGRを加えて8ビット符号とすることもできる。
複数の文字集合を利用するには、あらかじめ利用する文字集合をバッファという一時領域に設定しておき、必要に応じてバッファをGLやGRに呼び出したり、あるいは、バッファに設定する文字集合自体を切り替えたりすることで実現する。CLに呼び出せるバッファはC0の1つ、CRにはC1の1つ、GLとGRにはG0、G1、G2、G3の4つのバッファがある。例えば、G2をGRに呼び出すと、GRのコードでG2の文字集合が使えるようになる。GLとGRは、初期状態ではG0とG1がそれぞれ呼び出されている。G0をGRに呼び出すことだけはできない。
バッファを呼び出したり、文字集合を切り替えたりするには、エスケープシーケンスという特殊なバイト列を使う。また、バッファの呼び出し方式は、次に別の呼び出し指示が現れるまで継続するLS(Locking Shift)と、直後の1文字分だけを呼び出すSS(Single Shift)の2つがある。これはあたかもキーボードのCapsLockキーやShiftキーで入力する大文字小文字を連続的あるいは一時的に切り替えるのと似ている。なお、SSで呼び出せるのは、G2とG3のみである。
ISO-2022-JP
ISO-2022-JPは、ISO/IEC 2022に基づく日本語の文字符号化方式。7ビット符号で、電子メールなどで使われている。Shift_JISなどに対して、俗にJISコードと呼ばれる。ISO-2022-JPは7ビットコードなので、CLとGLのみを使う。CLはC0(ASCIIの制御文字)、GLはG0が呼び出された状態で固定で、バッファの切り替えではなく、G0への文字集合の割り当てを切り替えて使う。初期状態では、G0はASCIIの図形文字である。
対応する文字集合は、ASCIIの他に、JIS X 0201の英数字、それにJIS X 0208の1次規格と2次規格(78JISと83JIS)である。切り替えるためのエスケープシーケンスはそれぞれ「\x1B(B
」「\x1B(J
」「\x1B$@
」「\x1B$B
」(\x1B
はASCII制御文字のエスケープ)である。改行文字の前と終端では、ASCIIかJIS X 0201の英数字に戻さなければならない。
ISO-2022-JPは、JIS X 0201の半角カナには対応していない。これが「電子メールで半角カナを使うと文字化けする」と言われたり、後に半角カナをサポートしたShift_JISが誕生する理由の一つとなっている。
ISO-2022-JPの後継
ISO-2022-JP-1は、ISO-2022-JPに対して、JIS X 0212-1990(JIS補助漢字)をサポートしたものである。ISO-2022-JP-2は、ISO-2022-JPに対して、いくつかの他国の言語をサポートしたものである。
ISO-2022-JP-3では、ISO-2022-JPに比べて、JIS X 0201と78JISを廃止し、代わりにJIS X 0213:2000の1面と2面をサポートしたものである。そして、ISO-2022-JP-2004は、ISO-2022-JP-3のJIS X 0213:2000の代わりにJIS X 0213:2004を採用したものである。
以下に、対応する文字集合の違いと切り替えるためのエスケープシーケンスを示す。
文字集合 | エスケープシーケンス | ISO-2022-JP | ISO-2022-JP-1 | ISO-2022-JP-2 | ISO-2022-JP-3 | ISO-2022-JP-2004 | |
---|---|---|---|---|---|---|---|
ASCII |
|
|
|
|
|
| |
JIS X 0201英数字 |
|
|
|
|
|
| |
JIS X 0201カナ |
|
|
|
|
|
| |
JIS X 0208(78JIS) |
|
|
|
|
|
| |
JIS X 0208-1983(83JIS) |
|
|
|
|
|
| |
JIS X 0212-1990 |
|
|
|
|
|
| |
JIS X 0213:2000 | 1面 |
|
|
|
|
|
|
2面 |
|
|
|
|
|
| |
JIS X 0213:2004 | 1面 |
|
|
|
|
|
|
2面 |
|
|
|
|
|
| |
いくつかの他国語文字集合 |
|
|
|
|
|
※1:標準的なISO-2022-JPでは半角カナは非対応であるが、Microsoftが独自に拡張したISO-2022-JPなどでは、このエスケープシーケンスで半角カナに対応させたものもある。
Shift_JISとその拡張
日本語の符号化文字集合に対する代表的な文字符号化方式の一つであるShift_JISとその拡張について述べる。
Shift_JIS
Shift_JISは、Microsoftなどによって開発された有名な文字符号化方式。JIS X 0208を8ビットのコード空間上に巧みに再配置し(下の比較表を参照)、ASCII(0x00~0x7F)やJIS X 0201の半角カナ(0xA0~0xDF)と共存できるようにしたものである。
広く普及している、バイト数と文字幅(半角/全角)が一致する、などの特長がある反面、区点番号とバイト値の変換計算が煩雑、1バイト目か2バイト目かを判別できない、2バイト目に0x80未満のASCII文字を含む(特に0x5Cによる「だめ文字」問題)、これ以上の大きな拡張性が無い、JIS X 0212を表現できない、などの欠点がある。
Shift_JISの配置では、JIS X 0208の94区を全て収めてもまだ余分なコード空間があり、非公式ではあるが便宜上95~120区として扱われることがある。この場所は自由に使えるものとされ、実装した各社による様々な拡張・亜種が生まれることとなった。本来Shift_JISは、文字符号化方式のことであるが、こうして拡張された独自の文字集合とセットで考えられることもあり、文脈によって意味が様々である。
CP932(Microsoftコードページ932)
CP932は、Microsoftが、MS-DOSにShift_JISを採用したときに与えた名前。通称「MS漢字コード」などとも言う。OEMベンダーごとに独自拡張が許されていたため、各社によって文字集合がバラバラとなってしまう。その中でも、特にシェアの大きかったIBMとNECによる拡張は、互換性維持のため、後のWindows-31Jで一部が採用されている。
このような事情のため、「CP932」を特定の文字コードを指す言葉として用いると混乱を招くことがある。現在では、後に定められたWindows-31Jを指すこともあるが、例えば古いJavaでは、CP932は「IBMが拡張したCP932」だけを指し、Windows-31Jは別途「MS932」と呼ばれるなどしている。
Windows-31J
Window-31Jは、Windows 3.1のリリースに合わせて、JIS X 0208-1990をベースに、IBMとNECが独自拡張したCP932を融合して作られたShift_JISの文字集合。「マイクロソフト標準キャラクタセット」と呼ばれることもある。NECが9~13区に追加した文字のうち13区の83文字(通称「NEC特殊文字」)、89~92区に追加した全374文字(通称「NEC選定IBM拡張文字」)、そして、IBMが115~119区に追加した全388文字(通称「IBM拡張文字」)を採用した(「日本語の符号化文字集合」の節の比較表を参照)。
拡張された文字は、実はほとんどが重複している。NEC選定IBM拡張文字は、全てIBM拡張文字に含まれる。また、IBM拡張文字のうち、NEC選定IBM拡張文字に含まれない文字は全てNEC特殊文字に含まれている。つまり、NEC特殊文字とNEC選定IBM拡張文字を合わせたものは、IBM拡張文字を完全に含む。さらに、その中の10文字の記号は、JIS X 0208自体とも重複している。文字の重複は、他の文字コードからWindows-31Jに変換する際に、どれにマッピングするかが問題となる。Windowsでは、JIS X 0208、NEC特殊文字、IBM拡張文字、の順に優先してマッピングされることになっている。
NEC特殊文字、IBM拡張文字は全てUnicodeに登録されている。また、一部はJIS X 0212やJIS X 0213にも収録されている。IBM拡張文字(NEC選定IBM拡張文字)の中で特筆すべきものとして、苗字や名前でまれに使われる「はしご高」や「たつ崎」がある。
MacJapanese
MacJapaneseは、クラシックMacで使われていた、Appleが拡張したShift_JIS。9~15区に独自の特殊文字が登録されており、Windows-31Jの13区(NEC特殊文字)と互換性が無い。例えば、NEC特殊文字の「丸囲みの1」は、MacJapaneseでは「カッコ付きの日曜」である。このため、丸囲み文字などはMacとWindowsで表示が異なる、いわゆる機種依存文字となってしまい、使用が控えられることとなった。
Shift_JIS-2004
Shift_JIS-2004は、JIS X 0213に対応したShift_JIS。JIS X 0213の1面をこれまで通りそのまま1~94区に、2面をこれまで95~120区として使用していたコード空間に収まるように再配置したものである(下の比較表を参照)。Windows-31Jの拡張文字のうち、NEC特殊文字はJIS X 0213と一部互換性があるが、JIS X 0213の第3水準漢字に領域を奪われたNEC選定IBM拡張文字と、95区以降に配置されていたIBM拡張文字は全く互換性が無くなっている。
JIS X 0213:2000の時点では「Shift_JISX0213」という名前だった。
使用するバイト範囲の比較
Shift_JISと他の文字符号化方式で使用するバイト範囲の違いを比較した表を以下に示す。
面 | 区 | ISO-2022-JP | EUC-JP / EUC-JIS-2004 | Shift_JIS / Windows-31J | Shfit_JIS-2004 | ||||
---|---|---|---|---|---|---|---|---|---|
第1・第2バイト | 第1バイト | 第2バイト | 第3バイト | 第1バイト | 第2バイト | 第1バイト | 第2バイト | ||
1 | 01~62 | 0x21~0x7E | 0xA1~0xFE | 不使用 | 0x81~0x9F | ※3 | Shift_JISと同じ | ||
63~94 | 0xE0~0xEF | ||||||||
- | 95~120 | 非対応 | 0xF0~0xFC | 非対応 | |||||
2 | 01 | 0x21~0x7E | 0x8F | 0xA1~0xFE | 非対応 | 0xF0 | ※3 | ||
02 | 非対応 | ||||||||
03・04 | 0xF1 | ※3 | |||||||
05 | 0xF2 | ||||||||
06・07 | 非対応 | ||||||||
08 | 0xF0 | ※3 | |||||||
09~11 | 非対応 | ||||||||
12 | 0xF2 | ※3 | |||||||
13・14 | 0xF3 | ||||||||
15 | 0xF4 | ||||||||
16~77 | 非対応 | ||||||||
78 | 0xF4 | ※3 | |||||||
79~94 | 0xF5~0xFC |
※1:1面、2面、およびASCIIは、エスケープシーケンス(漢字シフトコード)によって切り替えられる。
※2:隣り合う2つの区(奇数・偶数)が同じバイトを共有している。
※3:奇数区が0x40~0x9E(0x7Fを除く)、偶数区が0x9F~0xFCとなる。
EUC-JPとその亜種
日本語の符号化文字集合に対する代表的な文字符号化方式の一つであるEUC-JPとその亜種について述べる。
EUC-JP
EUC-JPは、ISO-2022-JPと同様、ISO/IEC 2022に基づいた日本語の文字符号化方式である。8ビット符号で、GL(0x20~0x7E)とGR(0xA1~0xFE)にはそれぞれG0とG1が呼び出されており、SSによってG2とG3をGRに呼び出して使う。
G0はASCII、G1はJIS X 0208が割り当てられている。G2とG3は本来オプションとなっているが、一般的な実装では、G2にJIS X 0201の半角カナ、G3にJIS X 0212を割り当てているものが多い。G1やG3は、JIS X 0208やJIS X 0212を割り当てた場合は、2バイト文字となり、1バイト目、2バイト目ともにGRの0xA1~0xFEの値を取る(Shift_JISとその拡張の表を参照)。このため、ASCIIとそれ以外の区別が容易となっている。さらに、区点番号からの変換が簡単、Shift_JISの「だめ文字」問題が起きないなどの利点がある。
CP51932(Microsoftコードページ51932)
CP51932は、G1にWindows-31Jの1~94区を割り当てたEUC-JPの亜種。G2は半角カナで、G3は使わない。
Windows-31Jの拡張文字が使用可能となっているが、IBM拡張文字は範囲外なので割り当てられておらず、NEC特殊文字かNEC選定IBM拡張文字で代用する必要がある。
eucJP-ms
eucJP-msは、CP51932と同じくEUC-JPでWindows-31Jの文字を使えるようにしたEUC-JPの亜種。
G1はWindows-31Jに似ているが、85~94区がユーザー定義領域とされ、NEC選定IBM拡張文字は含まれていない。また、G3には、基本的にJIS X 0212を配置しているが、加えて83~84区にはIBM拡張文字の一部も再配置されている。
EUC-JIS-2004
EUC-JIS-2004は、JIS X 0213に対応したEUC-JP。JIS X 0213の1面をG1、2面をG3、半角カナをG2に割り当てたもの。
JIS X 0213:2000の時点では「EUC-JISX0213」という名前だった。
外部リンク
文字集合関連
Shift_JIS関連
EUC-JP関連
文字一覧