## 漢字コードについて

トップ > アラカルト > 漢字コードについて

#### ■ 漢字コードとは

コンピュータの内部では文字を数値として扱います。例えば 'A' という文字には65(16進数で0x41)というコードが割り当てられています。これを文字コードと呼びます。アルファベットや数字などのいわゆる半角文字は1バイト(8ビット)で表すことができますが、日本語の漢字を含む文字コードは最低でも2バイト(16ビット)を必要とします。この、漢字を含む多バイト系のコードを漢字コードと呼びます。(実際にはひらかな、カタカナ、全角英数字も含まれるので漢字コードという呼び名は適切ではないのですが...)

#### ■ 文字コードのいろいろ

現在主に使用されている文字コードの体系として以下のものがあります。

- ASCIIコード ... いわゆる半角英数文字
- JISコード ... 電子メール転送などに使用
- シフトJIS ... 主にWindowsやMacintoshで使用
- EUC ... 主にUNIXで使用
- Unicode ... 日本ではまだ完全には普及していない

この、乱立する文字コードが原因で「文字化け」が発生することがあります。文字化けに関する詳細は「文字化けしないようにするには」を参照してください。

#### ■ ASCIIコード

ASCII(American Standard Code for Infomation Interchange)が定めるコードです。俗に言う半角文字です。「JIS X 0201 の Roman Set」としてJISにも規定されています。例えば A のASCIIコードは 0x41 となります。(0xは、C言語やPerlでの表記法で、16進数を表します。)

| 上位４ビット
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
下 位 ４ ビ ッ ト | 0 | NUL | DLE | SP | 0 | @ | P | ` | p
1 | SOH | DC1 | ! | 1 | A | Q | a | q
2 | STX | DC2 | " | 2 | B | R | b | r
3 | ETX | DC3 | # | 3 | C | S | c | s
4 | EOT | DC4 | $ | 4 | D | T | d | t
5 | ENQ | NAK | % | 5 | E | U | e | u
6 | ACK | SYN | & | 6 | F | V | f | v
7 | BEL | ETB | ' | 7 | G | W | g | w
8 | BS | CAN | ( | 8 | H | X | h | x
9 | HT | EM | ) | 9 | I | Y | i | y
A | NL | SUB | * | : | J | Z | j | z
B | VT | ESC | + | ; | K | [ | k | {
C | NP | FS | , | < | L | \ | l | |
D | CR | GS | - | = | M | ] | m | }
E | SO | RS | . | > | N | ^ | n | ~
F | SI | US | / | ? | O | _ | o | DEL

#### ■ JISコード

JIS(Japan Industory Standard)で定められる漢字コードです。インターネットにおける電子メールはJISで送付することになっています。1文字を2バイトで表します。2バイト共0x21〜0x7Eの範囲で、そのままだと半角文字との区別がつかないため、KI/KO(漢字IN/漢字OUT)コードを用いて識別します。例えば「WWW入門!」をJISコードで表すと次のようになります。

W | W | W | (KI) | 入 | 門 | (KO) | !
57 | 57 | 57 | 1B 24 40 | 46 7E | 4C 67 | 1B 28 4A | 21

KI/KOなどに用いられるコード(エスケープシーケンス)として、以下のものがあります。(正確に言うなら「ESC ( J」は「JISローマ字IN」であり、「漢字OUT」ではないことがわかります。)

記号表記 | 16進表記 | 意味
--- | --- | ---
ESC ( B | 1B 28 42 | ASCII
ESC ( J | 1B 28 4A | JIS X 0201-1976 Roman Set
ESC ( I | 1B 28 49 | JIS X 0201-1976 片仮名
ESC $ @ | 1B 24 40 | JIS X 0208-1978(通称：旧JIS)
ESC $ B | 1B 24 42 | JIS X 0208-1983(通称：新JIS)
ESC & @ ESC $ B | 1B 26 40 1B 24 42 | JIS X 0208-1990
ESC $ ( D | 1B 24 28 44 | JIS X 0212-1990

※ JIS X 0208 は昔は JIS C 6226 と呼ばれていました。
※ JIS X 0201 は昔は JIS C 6220 と呼ばれていました。

#### ■ １バイト文字セット(JIS X 0201-1976)

1976年に JIS C 6220 として制定されました。ローマ字と片仮名が定義されています。ローマ字の部分は ISO 646 と同等、ASCII とほぼ同等です。ASCII との差異は、バックスラッシュ（＼）が円マーク（￥）に置き換え、チルダ（~）がオーバーライン（￣）に置き換え、の2点です。

片仮名の部分は通称「半角カタカナ」と呼ばれ、通常、0xA1〜0xDFまでの1バイトで1文字のカタカナを表現します。半角カタカナを使用したページは、シフトJISとEUCの区別がつきづらく、文字化けが発生しやすい、他の漢字コードに変換できないケースがあるなどの理由で、電子メールやWebページなどのインターネット上では使用すべきではないとされています。

#### ■ JISコード(JIS X 0208-1978)

1978年に JIS C 6226 として制定されました。よく使用する文字として第一水準文字が、時たま使用する文字として第二水準文字が、合計約6000文字ほど定義されています。1987年に JIS C 6226 は JIS X 0208 に改名されました。

#### ■ JISコード(JIS X 0208-1983)

JIS X 0208-1983では、それまでのJIS X 0208-1978に対して以下の変更が行われました。

(1) 第一水準、第二水準文字の入れ換え22組

    鯵鰺　鴬鶯　蛎蠣　撹攪　竃竈　潅灌　諌諫　頚頸　砿礦　蕊蘂
    靭靱　賎賤　壷壺　砺礪　梼檮　涛濤　迩邇　蝿蠅　桧檜　侭儘
    薮藪　篭籠

(2) 第一水準の字形を第二水準に移動し、空いた所に4文字追加

    尭堯　槙槇　遥遙　瑶瑤

(3) 特殊文字39字の追加

    ∠ ⊥ ⌒ ∂ ∇ ≡ ≒ ≪ ≫ √
    ∽ ∝ ∵ ∫ ∬ ∈ ∋ ⊆ ⊇ ⊂
    ⊃ ∪ ∩ ∧ ∨ ¬ ⇒ ⇔ ∀ ∃
    ♯ ♭ ♪ † ‡ ¶ ◯ Å ‰

(4) 罫線文字32字の追加

    ─ │ ┌ ┐ ┘ └ ├ ┬ ┤ ┴ ┼ ━ ┃ ┏ ┓ ┛
    ┗ ┣ ┳ ┫ ┻ ╋ ┠ ┯ ┨ ┷ ┿ ┝ ┰ ┥ ┸ ╂

#### ■ JISコード(JIS X 0208-1990)

JIS X 0208-1990では、さらに、次の変更が加えられました。

(1) 第二水準への追加

    凛(515B)の異体字(7425)と、煕(5F66)の異体字(7426)

(2) JIS X 0212（補助漢字）の定義

    特殊文字(21字)、アルファベット(245字)、漢字(5801字)

#### ■ 電子メールの日本語コード(ISO-2022-JP)

電子メールなどではよく iso-2022-jp を用います。iso-2022-jp は、(正確な表現ではありませんが）下記のコードの総称と思ってください。

- ASCII
- JIS X 0201-1976 Roman Set
- JIS X 0208-1978
- JIS X 0208-1983

このリストの中に「JIS X 0201 片仮名」が含まれていないため、「電子メールでは半角片仮名を使ってはいけない」となります。（iso-2022-jp でなければいいのかも。）

#### ■ シフトJIS

MS-DOS、Windows、Macintoshなどで用いられている漢字コードです。マイクロソフト社が提唱したもので、「MS漢字コード」とも呼ばれます。

MS-DOSでは0xA1〜0xDFがすでに半角カタカナの領域として使用されていたため、この領域、およびDELコードに対応する0x7Fの領域を避けるように、JISコードを巧みにシフトさせたものになっています。

第１バイトは 0x80 以上でトップビットが立っていますが、第２バイトは通常の半角文字と重複した領域に定義されているため、注意が必要です。

#### ■ EUC

Extended Unix Code の略で、UNIX系ワークステーションで広く用いられている形式です。UI(Unix International)が SVR4 のリリースと同時に発表した MNLS(Multi-National Language Supplement)が定めました。

JISコードに対して、第１バイト、第２バイト共に 0x80 だけシフトさせた(つまり、トップビットを立てただけ)もので、こちらの方が、シフトJISと呼ぶにふさわしいとも思います。

日本語２バイトは両バイト共，トップビットが立っているため、perlで処理を行う際にも簡単です。

#### ■ Unicode

最近注目されている文字コードで、日本語の漢字も中国語の漢字も区別なく、一括に扱ってしまおうというものです。ISO10646などで定義されています。ただし、従来のJISコードとの互換性が無く、変換するには、すべての漢字コードを含む十数キロバイトの大きさの変換表が必要になります。

- Unicodeコンソーシアム
- Unicode変換表

#### ■ メーカー独自拡張コード

例えば、NECのPC-98000シリーズでは、JIS1978にNEC独自文字を追加したものを定義しています。

○付き数字(20文字)、○付き上下左右(4文字)、ギリシャ数字(10文字)、カタカナ単位文字(16文字)、mm単位文字(7文字)、元号文字(4文字)、(株)(3文字)、数学記号(13文字)など

#### ■ 文字コード自動変換の仕組み

ブラウザなどは、文書がJIS/シフトJIS/EUCのいずれで記述されているか自動的に判断、変換して表示しています。自動的判断の仕組みは、まず、ESC(0x1b) $(0x24) @(0x40)などのKI/KOコードが存在すればJISと見なします。それ以外の場合は、このページの下にある漢字コード表で、シフトJISしか存在しない領域の文字コードがあればシフトJIS、EUCしか存在しない領域の文字コードがあればEUCと判断しています。しかし、シフトJISとEUCは領域が一部重複しているため、後述する「文字化け」の現象が発生したりします。

#### ■ どうして文字化けがおこるのか？

文字化けが発生するのはいくつかの原因があります。

1. シフトJISとEUCを見分けられない

   ブラウザなどは、ドキュメントの漢字コードを自動判別します。しかし、漢字コードマップから解るように、シフトJISとEUCのコードが一部(紫部分)重複しているために、EUCのファイルをシフトJISのファイル(またはその逆)と誤判定し、文字化けが発生することがあります。(→文字化けしないようにするには)

2. シフトJISの第2バイト問題

   CGI利用のページで「表示」が「侮ヲ」に化けたりするケースです。「表示」をシフトJISのコードで表わすと「95 5c 8e a6」となりますが、この 5c はバックスラッシュ(\)と同じコードであり、これをperlが \n や \t のような特別な値(エスケープシーケンス)だと思って処理してしまうことに原因があります。一度EUCに変換して処理したり、「表\示」のように余分なバックスラッシュ(\)を記述することにより回避できます。

3. ファイル転送時に化ける

   日本語対応されていないFTPソフトのテキストモード(ASCIIモード)でファイルを転送する際に、文字化けが発生することがあります。これは、FTPが転送効率を上げるために、テキストモードでは文字コードのトップビットを落として転送することにより発生します。

4. トップビットが落ちてしまう問題

   その他にも、電子メールをEUCやシフトJISで送信したために、途中のメール転送ソフトが文字コードのトップビットを落としてしまうために発生したりすることがあります。

#### ■ 各コード間の変換アルゴリズム

c1を第一バイト、c2を第二バイトとします。EUC→SJISは(1)と(3)を、SJIS→EUCは(4)と(2)を組み合わせてください。

(1) EUC から JIS に変換

    c1 = c1 - 0x80;
    c2 = c2 - 0x80;

(2) JIS から EUC に変換

    c1 = c1 + 0x80;
    c2 = c2 + 0x80;

(3) JIS から シフトJIS に変換

    if (c1 % 2) {
        c1 = ((c1 + 1) / 2) + 0x70;
        c2 = c2 + 0x1f;
    } else {
        c1 = (c1 / 2) + 0x70;
        c2 = c2 + 0x7d;
    }
    if (c1 >= 0xa0) { c1 = c1 + 0x40; }
    if (c2 >= 0x7f) { c2 = c2 + 1; }

(4) シフトJIS から JIS に変換

    if (c1 >= 0xe0) { c1 = c1 - 0x40; }
    if (c2 >= 0x80) { c2 = c2 - 1; }
    if (c2 >= 0x9e) {
        c1 = (c1 - 0x70) * 2;
        c2 = c2 - 0x7d;
    } else {
        c1 = ((c1 - 0x70) * 2) - 1;
        c2 = c2 - 0x1f;
    }

#### ■ 漢字コードマップ

| 第２バイト
第 １ バ イ ト |
|  | 00 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | x | 80 | 90 | A0 | B0 | C0 | D0 | E0 | F0
00 |
10 |
20 |  |  | ○ | ― | ― | ● | △ | ▲
30 |  |  | □ | ― | ― | ― | ― | ■
40 |  |  |
50 |  |  | ☆ | ― | ― | ★ |
60 |  |  |
70 |  |  |
80 |  |  | ○ | ― | ― | ● |  | △ | ▲ | □ | ― | ― | ― | ― | ■
90 |  |  |  |  |
A0 |  |  | ○ | ― | ― | ● | △ | ▲
B0 |  |  |
C0 |  |  |
D0 |  |  | ☆ | ― | ― | ★ |
E0 |  |  | ☆ | ― | ― | ★ |  |  |
F0 |  |  |  |  |  |

JIS | 第1バイト=0x21〜0x7E 第2バイト=0x21〜0x7E
シフトJIS | 第1バイト=0x81〜0x9F/0xE0〜0xEF(〜0xFC〜0xFE) 第2バイト=0x40〜0x7E/0x80〜0xFC
EUC | 第1バイト=0xA1〜0xFE 第2バイト=0xA1〜0xFE
EUC/SJIS | EUCとシフトJISの重複領域 |
半角カタカナ | 0xA1〜0xDF |

- シフトJISとEUCはコードが重複しているので、nkf(Network Kanji Filter)などのような自動判別プログラムは間違いを起こす可能性がある。ただし、この重複部分は第二水準の後半にあたるので、文章中の全ての文字がこの領域にはいる可能性は低い。
- EUC(SS2) 0x8EA1 〜 0x8EFE MS-DOSの半角カナ(0xA1〜0xDF)がこれに割り当てられている。
- EUC(SS3) 0x8F 0x?? 0x?? 外字に用いる。
- シフトJIS(半角カタカナ) 0xA1〜0xDF
- JISをシフトJISに単純にマッピングできるのはシフトJISの第1バイトが〜0xEFまで。0xF0以降は外字などに用いられる。

Copyright (C) 1996-2000 杜甫々
http://www.tohoho-web.com/wwwkanji.htm