漢字コードについて

とほほのWWW入門 > アラカルト > 漢字コードについて
2000年9月3日版

漢字コードとは

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

文字コードのいろいろ

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

ASCIIコード

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


上位4ビット
01234567





0NULDLESP0@P`p
1SOHDC1!1AQaq
2STXDC2"2BRbr
3ETXDC3#3CScs
4EOTDC4$4DTdt
5ENQNAK%5EUeu
6ACKSYN&6FVfv
7BELETB'7GWgw
8BSCAN(8HXhx
9HTEM)9IYiy
ANLSUB*:JZjz
BVTESC+;K[k{
CNPFS,<L\l|
DCRGS-=M]m}
ESORS.>N^n~
FSIUS/?O_oDEL

JISコード

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

WWW(KI)(KO)!
5757571B 24 4046 7E4C 671B 28 4A21

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

記号表記16進表記意味
ESC ( B1B 28 42ASCII
ESC ( J1B 28 4AJIS X 0201-1976 Roman Set
ESC ( I1B 28 49JIS X 0201-1976 片仮名
ESC $ @1B 24 40JIS X 0208-1978(通称:旧JIS)
ESC $ B1B 24 42JIS X 0208-1983(通称:新JIS)
ESC & @ ESC $ B1B 26 40 1B 24 42JIS X 0208-1990
ESC $ ( D1B 24 28 44JIS X 0212-1990
JIS X 0208 は昔は JIS C 6226 と呼ばれていました。 JIS X 0201 は昔は JIS C 6220 と呼ばれていました。

1バイト文字セット(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 は、(正確な表現ではありませんが)下記のコードの総称と思ってください。 このリストの中に「JIS X 0201 片仮名」が含まれていないため、「電子メールでは半角片仮名を使ってはいけない」となります。(iso-2022-jp でなければいいのかも。)

シフトJIS

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

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

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

EUC

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

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

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

Unicode

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

メーカー独自拡張コード

例えば、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;
    }

漢字コードマップ


第2バイト




  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〜0xFC
第2バイト=0x40〜0x7E/0x80〜0xFC
EUC第1バイト=0xA1〜0xFE
第2バイト=0xA1〜0xFE
EUC/SJISEUCとシフトJISの重複領域


Copyright (C) 1996-2000 とほほ
http://wakusei.cplaza.ne.jp/twn/wwwkanji.htm