漢字コードについて

来源:互联网 发布:网络销售计划书 编辑:程序博客网 时间:2024/05/23 22:07

 ■ 漢字コードとは

コンピュータの内部では文字を数値として扱います。例えば '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進数を表します。)


上位4ビット01234567下




ト0NULDLESP0@P`p1SOHDC1!1AQaq2STXDC2"2BRbr3ETXDC3#3CScs4EOTDC4$4DTdt5ENQNAK%5EUeu6ACKSYN&6FVfv7BELETB'7GWgw8BSCAN(8HXhx9HTEM)9IYiyANLSUB*:JZjzBVTESC+;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 42ASCIIESC ( J1B 28 4AJIS X 0201-1976 Roman SetESC ( 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-1990ESC $ ( 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 は、下記のコード等を7bitデータにエンコーディングします。

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

■ シフト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コード(ISO-2022-JP)で用いるコードに対して、第1バイト、第2バイト共に 0x80 だけシフトさせた(つまり、トップビットを立てただけ)もので、こちらの方が、シフトJISと呼ぶにふさわしいとも思います。

日本語2バイトは両バイト共,トップビットが立っているため、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(ISO-2022-JP)に変換

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バイト第



ト  0010203040506070x8090A0B0C0D0E0F000 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~0xFCEUC第1バイト=0xA1~0xFE
第2バイト=0xA1~0xFEEUC/SJISEUCとシフトJISの重複領域

半角カタカナ0xA1~0xDF

  • シフトJISとEUCはコードが重複しているので、nkf(Network Kanji Filter)などのような自動判別プログラムは間違いを起こす可能性がある。ただし、この重複部分は第二水準の後半にあたるので、文章中の全ての文字がこの領域にはいる可能性は低い。
  • EUC(SS2) 0x8E 0xA1 ~ 0x8E 0xDF MS-DOSの半角カナ(0xA1~0xDF)がこれに割り当てられている。
  • EUC(SS3) 0x8F 0x?? 0x?? 第四水準漢字等に割り当てられる。