9部 付録

文字コードの基礎

ASCII コード

  • ASCII コードの概要
  • ASCII コードの符号化
  •   ∟TABLE ASCII コードの符号と文字の対応一覧
      ∟TABLE ASCII コードの構成
      ∟TABLE 制御文字の一覧
      ∟TABLE 変更可能な文字コードの一覧

  • 8ビット拡張 ASCII コード
  •   ∟TABLE ISO の 8 ビットコードの構成

    ブラウザでホームページを閲覧している際や、メールの受信時などで、すべての文字が暗号のような意味不明の単語が羅列され、文章の内容が把握できない、文字化けという現象がまれに発生します。その原因は文字コードと呼ばれるものにあります。

    ASCII コードの概要

    CGIで日本語を正しく表示させるには、コンピュータが文字列をどのように扱っているかを知っておく必要があります。高度な処理は別にしても、ブラウザやメール上での文字化を防いだり、表示されない文字列を使うように注意する際には必須の知識です。

    文字の符号化について

    コンピュータが英語や漢字などの文字列を処理する際は、文字と整数を対応させて扱っています。これを文字の『符号化』といいます。たとえば、"J" という文字を表す符号は "1001010" で、この符号が『文字コード』と呼ばれるものです。

    ASCII コードについて

    文字の符号化の基本になっているのは、『ANSI(米国規格協会)』によって定められた『ASCII』コードです。ASCIIコードは、1文字を表現するのに1バイトを使います。1バイトは256種類の文字を表現することができますが、ASCIIコードは最上位の1ビットを常に0とするので、実際は下位7ビットを使って128種類の文字が扱えます。

    符号化
    文字や記号をコンピュータで扱うために、文字や記号に固有の数字を対応させること。
    ASCII
    (American Standard Code for Information
    Interchange):
    ビット
    コンピュータが扱う情報の最小単位です。
    バイト
    1バイトは8ビットに相当します。多くのコンピュータは情報の記憶や処理をバイト単位で行ないます。

    ASCII コードの符号化

    ASCIIコードの符号化は、7ビットの2進数で表現されています。ここでは読みやすいように、2進数を16進数(0x00~0x7F)に変換し、スラッシュ(
    / )で区切って表記します。たとえば、"J" という文字の符号化は2進数で 1001010になりますが、それを16進数に変換して 4A 、それをわかりやすく区切って 4/A と表記します。

    ASCIIコードの符号と文字の対応一覧
      上位3ビット→


    4



      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 NAC % 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 LF/NL SUB * : J Z j z
    B VT ESC + ; K [ k {
    C FF FS , < L l |
    D CR GS - = M ] m }
    E SO RS . > N ^ n ~
    F SI US / ? O _ o DEL
    ASCII コードの構成
    文字 1バイト領域
    制御文字 0/0~2/0、7/F
    図形文字 2/1~7/E

    印字可能な文字部分は、図形文字の 2/1~7/E の範囲にある文字で、その他は『制御文字』です。制御文字は普通の文字ではなく、文字データの中に混じって特別な機能を表すものです。

    制御文字の一覧は次のとおりです。

    制御文字の一覧
    16進 コード 解説   16進 コード 解説
    0/0 NUL ヌル(空文字) 0/1  DC1 制御装置1
    0/1 SOH ヘディング開始 0/2 DC2 制御装置2
    0/2 STX テキスト開始 0/3 DC3 制御装置3
    0/3 ETX テキスト終了 0/4 DC4 制御装置4
    0/4 EOT 伝送終了 0/5 NAC 否定応答
    0/5 ENQ 問い合わせ 0/6 SYN 同期文字
    0/6 ACK 肯定応答 0/7 ETB 伝送ブロック終了
    0/7 BEL ベル 0/8 CAN 取消
    0/8 BS バックスペース 0/9 EM 媒体終端
    0/9 HT 水平タブ 0/A SUB  
    0/A LF/NL 復帰/改行 0/B ESC (制御コード)拡張
    0/B VT 垂直タブ 0/C FS ファイルセパレータ
    0/C FF 改ページ 0/D GS グループセパレータ
    0/D CR 復帰 0/E RS レコードセパレータ
    0/E SO シフトアウト 0/F US ユニットセパレータ
    0/F SI シフトイン 2/0 SP (半角)スペース
    1/0 DLE データリンクでの拡張 7/F DEL 削除
    制御文字
    ディスプレイやプリンタを制御する特別な文字で、画面に表示されることはありません。改行(CR)やエスケープ(ESC)、タブ(TAB)などが制御文字になります。ASCII
    コードでは 0/0~1/F と 7/F の範囲に制御文字が配置されています。

    ISO646: ASCII コードの変更可能な領域

    ASCIIは米国での利用を想定して考案されたものですが、いくつかの文字を必要に応じて入れ替えれば、他の西欧諸国でも使用することが可能でした。そこで、『ISO(国際標準化機構)』によって国際規格が定められ、『ISO646BCT(Basic Code Table)』として標準化されました。米国では US-ASCII 、日本では『JIS X 0201 ローマ字』、一般に『JISローマ字』と呼ばれています。JISローマ字はあくまで日本版のASCII という意味ですから、漢字やひらがななどを含みません。

    ISO646 で定められている変更可能な文字コードは以下のとおりです。

    変更可能な文字コードの一覧
    符号 2/3 2/4 4/0 5/B 5/C 5/D 5/E 6/0 7/B 7/C 7/D 7/E
    ASCII
    文字
    # $ @ [ ] ^ ` { | }

    JIS ローマ字は、5/C のバックスラッシュ( \ )の代わりに円( ¥ )を割り当て、7/Eのチルダ( ~ )の代わりにオーバーライン(  ̄ )を割り当てています。それ以外は US-ASCIIと同じです。

    用語
    ISO
    International Standards Organization:
    国際標準化機構の略と、規格番号として使われています。

    8ビット拡張 ASCII コード

    ISO646で表現できるのはアルファベットを使う国々に限定され、文字体系が異なるロシアやギリシア語などではさらに拡張が必要でした。ASCIIコードは最初の桁を常にゼロとしているので、1バイトで扱える文字は128種類、実質は、7ビットしか使っていません。そこで、最初の桁も有効に使えるようにISO646を8ビットに拡張し、 8/0~F/F の領域に文字を追加できるようにしました。この仕組みを「拡張ASCII コード」 と呼びます。

    ISO8859

    拡張ASCIIコードでは、拡張した領域を使って96種類の文字が追加削除が可能になっています。この96の領域を各国の必要に応じて追加文字のセットを順次制定しました。それが『ISO8859』です。
    日本でもISO8859に従って、カタカナを扱える(漢字やひらがなは未対応)『JIS X 0201 カタカナ』があります。これは、一般的に『JISカタカナ』と呼ばれています。

    ISO の 8 ビットコードの構成

    文字 1バイト領域
    制御文字 0x00~0x1F, 0x7F
    空白 0x20
    図形文字 0x21~0x7E
    制御文字の領域 0x80~0x9F
    追加の図形文字 0xA0~0xFF


    マルチバイトコード:日本語を表現できる文字コード

    1バイトで表現できる言語はロシア語やギリシャ語までで、日本を含めたアジア諸国の複雑な表現の言語はすべての文字を表現することができません。日本語は漢字だけでも数千個を上回りますから、最低でも2バイトを使って1文字を表現する必要があります。このような1バイトを超える文字コードを『マルチバイトコード』と呼びます。
    日本語を表現できるマルチバイトコードの種類には、大きく分けて JIS、シフトJIS、 EUC、 UNICODEがあります。このうち、JISコードはインターネットで広く使われており、シフトJISはウインドウズシリーズやMacOS、 EUC は UNIX 系OSでよく使われています。UNICODEに関しては、この中で一番新しく、ウインドウズシリーズやMacOSはもちろん、様々な環境でサポートされ始めています。
    インターネットでは様々な文字コードが利用されており、そのために文字化けや様々な問題が起きやすくなっています。完全に文字化けを防ぐことは非常に難しいのですが、ある程度の問題を防ぎ、対処することは可能です。そのためには、文字コードについての知識と、対処法を身に付ける必要があります。ここでは、JIS、シフトJIS、EUC、UNICODEの4種類の文字コードを紹介します。

    JISコード

    JISローマ字、JISカタカナの制定という流れから、当然、日本語を扱いたいという要望がありました。しかし、日本語や中国語のように字数が多い言語は1バイトで表現可能な256文字をはるかに超えるので、ISO646のようなASCIIを拡張する方式では限界があります。そこで、複数のバイトを使用して文字コードを表現する方式が考え出され、『JIS X 0208』として制定されています。単にJISコードとも呼ばれています。

    JIS コード範囲

    文字 1バイト目の領域 2バイト目の領域
    制御コード 0/0~1/F、7/F -
    ASCII 2/0~7/E -
    半角カタカナ 2/1~5/F (7ビット) / A/1~D/F (8ビット) -
    漢字 2/1~7/E 2/1~7/E
    補助漢字 2/1~7/E 2/1~7/E

    JISコードは、1バイト文字としてASCIIと半角カタカナがあり、2バイト文字として漢字が追加されています。JISコード には、ASCIIの倍の幅で表示するアルファベットや数字などの文字があります。このことから、JIS漢字の半分の幅のASCII文字は『半角文字』、JIS漢字は『全角文字』と呼ばれています。

    JIS コードには旧版と新版があり、それぞれ規格の制定された年号を付けて、JIS
    X0208-1978
    およびJIS X0208-1983と呼ばれています。2つの違いは、同じ文字の旧字体と新字体が一部で入れ替わったことと、新版では漢字が4文字、特殊文字が39文字、罫線素片が32文字増えたことです。

    ISO2022

    マルチバイトコードによって、文字数の多い言語もカバーできるようにはなりましたが、複数の国の言語を混在させて使うということはできません。複数の国の言語を支障なく表現するには、一括してすべての言語を表現できる文字セットを制定するか、必要に応じて文字セットを切り替えて使えるようにするかの方法が考えられます。後者の文字セットを切り替える方式は、ISOによって符号拡張法『ISO2022』が標準化されています。JIS規格では『JIS X 0202』 です。ISO2022 は文字セットを切り替えるための規格で、ASCIIコードのような文字セットではないことに注意してください。

    ISO2022は、『エスケープシーケンス』と呼ばれる特殊な符号を使って、文字セットを切り替える方法を定めた国際規格です。これによって、マルチバイト文字やISO646各国語版などの複数の文字セットを混在して使うことが可能になりました。先に解説した JISコードも、ISO2022準拠の符号拡張方式を適用することで、1バイトのASCIIやJISローマ字と切り替えながら共に用いることができます。
    ISO2022の符号拡張方式はかなり複雑なので、完全に実装されているわけではありません。JISコードはeメールやニュースグループなどでネットワーク上でも標準的に使用されていますが、そこではISO2022を簡略化して符号化を行っています。この方式は『ISO-2022-JP』という名称でRFC1468日本語訳)に定義されています。

    ※)文字セットを切り換えながら使っていても、機能文字は影響を受けません。たとえばTABやESCなどは、文字セットに関わらず使うことができます。

    ISO-2022-JP

    ISO-2022-JPを例にして、ISO2022の文字セットを切り替える方式を少し詳しく見ていきましょう。

    多くのネットワークは7ビットでメッセージの交換を行うので、ネットワークでのJISコードは7ビット版が標準です。7ビットJISコードは、ASCIIと同じように下位7ビットだけを使い、7ビットコード2文字(2/1~7/E)を組み合わせて日本語1文字を表します。これがISOによって国際化され、ISO-2022-JPとなりました。

    ISO-2022は、エスケープシーケンスでそれ以降の文字セットを宣言します。デフォルトがASCIIになっているので、エスケープシーケンスが宣言されていない場合は、すべてASCIIとして扱われます。エスケープシーケンスで日本語文字の宣言を行った後、終わりにまたASCIIを示すエスケープシーケンスを使います。

    ISO-2022-JPのエスケープシーケンスは下記の表のとおりです。

    切り替えられる文字コード コード エスケープシーケンス
    ASCII(1バイト)の開始 1/B 2/4 4/0 [ESC] ( B
    JISローマ字(1バイト)の開始 1/B 2/4 4/2 [ESC] ( J
    JIS-1978(漢字2バイト)の開始 1/B 2/8 4/A [ESC] $ @
    JIS-1983(漢字2バイト)の開始 1/B 2/8 4/2 [ESC] $ B

    たとえば、「5月30日」をISO-2022-JPでエンコードすると、「5(1B 24 42)月(1B
    28 42)20(1B 24 42)日(1B 28 42)」というようにエスケープが挿入されます。

    シフトJIS(MS漢字コード)

    MS-DOS で日本語文字を表すコードとして、マイクロソフト社とアスキー社が共同開発したのが『シフトJIS』です。MS漢字コードとも呼ばれ、MS-DOSやウインドウズシリーズ、一部の UNIX 系 OS や、マッキントッシュなどでも使用されています。シフトJISの名前の由来は、JIS コードを簡単な計算で変換(シフト)していることにあるのですが、もともと JIS規格ではなく、ISO2022 にも準拠していません。

    シフトJIS は、JIS コードのようにエスケープシーケンスを使いません。シフトJIS
    での日本語文字は、最初の1バイト目を 8/1~9/F、E/0~E/Fの領域に割り当てています。この領域は、ASCII の領域 2/1~7/E や半角カタカナの領域 A/1~D/Fに重ならないので、この領域のバイトが出現したら、2バイト文字コードだと判断することができます。また、2バイト目の領域は4/0~7/E、8/0~F/C で、区切り文字として使われることの多い 2/0~3/F や、制御コードである7/F と重複しないように配慮されています。

    ウインドウズ上で CGI プログラムを作成する際に起こる文字コードの問題のほとんどは、シフトJISがらみです。なかでもよく問題にされるのが、文字コードを シフトJIS
    のままメール送信してしまうようなプログラムです。シフトJISは8ビット目も使っているので、サーバ間でのメール転送中に8ビット目を切り落とされてしまい、文字化けが発生することがあります。また、2バイト目に含まれる4/0~7/E のコード、特に、ASCII のバックスラッシュにあたる 5/C が問題です。これらの領域はASCIIとしても使われているので、利用方法によっては2バイト文字としてではなく1バイト文字2つとして扱われてしまうことがあります。代表的な例として、初心者のCGIプログラマーがよく陥るケースとして、ほとんどの文章は問題ないのに、「表示する」という文字列が表示できない、という現象があります。このあたりのことは、また詳しく解説します。

    シフトJIS コード範囲

    文字 1バイト目の領域 2バイト目の領域
    制御コード 0/0~1/F、7/F -
    ASCII文字 2/0~7/E -
    半角カタカナ A/1~D/F -
    漢字 8/1~9/F、E/0~F/C 4/0~7/E、8/0~F/C

    EUC

    EUC(Extended UNIX Code、「拡張UNIXコード」)』はAT&T社によって定められ、UNIX環境での事実上の標準日本語コードとなっています。日本語EUCもJISコードと同じくJISX0208 の文字セット規格をISO2022に基づいて符号化しています。EUC自身は、日本語だけでなく複数の文字セットを同じテキスト内で処理することが可能です。

    CGIプログラムで発生する文字化けのほとんどは、文字コードをEUCにすることで解決できます。

    EUC コード範囲

    文字 1バイト目の領域 2バイト目の領域 3バイト目目の領域
    制御コード 0/0~1/F、7/F    
    ASCII 2/1~7/E - -
    半角カタカナ 8/E A/0~F/F -
    漢字 A/0~F/F A/0~F/F -
    補助漢字 8/F A/0~F/F A/0~F/F

    UNICODE

    UNICODEの歴史には、ビデオのベータや VHS に似た規格闘争の経緯があります。ISOが、世界中の主要な文字を一括して扱うという発想の元に多言語文字セット規格の『ISO10646』として策定を行っていました。ISO10646は『UCS(Universal multi-octet coded Character Set)』とも呼ばれ、2バイト単位のUCS-2と、4バイト単位の UCS-4 があります。もう一方では、米国の有力コンピュータ企業であるマイクロソフト社やIBM 社、アップル社などが設立した『Unicode コンソーシアム』によって、UNICODEという文字セットを提唱されました。
    ISOは、2つの規格が両立することを避けるため、ISO10646は否決とし、UNICODEの修正案をISO10646-1として正式に制定しました。JIS 規格では、『JIS X 0221』です。
    現在では、ウインドウズシリーズや MacOS などでUNICODEが採用され、最新のブラウザやメールソフトなどもUNICODEに対応しています。

    UNICODEは、ISO2022のように文字コードの切り替えをする代わりに、2バイトの領域に世界中のあらゆる文字を詰め込もうという規格です。普通に考えれば、2バイトの領域に全ての言語の文字を詰め込むのは不可能なことなので、似た字形の漢字を統合して扱うなどの無理をしています。

    UNICODE における日本語文字の表現は、1バイト目を 4/E~9/F 、2バイト目を 0/0~F/F の全領域に割り当てたものです。日本の文字コードとして JIS X 0208 とJIS X 0212
    をサポートしています。JISコードとの規則的な変換ルールは存在しないので、個々の文字を対応させる変換表が必要になります。

    UCS-4

    一般にUCSと呼ばれている符号化で、1文字あたり4バイト使用するためにUCS-4とも呼ばれます。コード表は 0 ~ 7/F F/F F/F F/Fの領域を使い、約21億文字を扱えます。UCS-4ではUCS-4とUTF-8の2種類のコーディングが可能で、標準では有りませんがUTF-9というコーディングもあります。

    UCS-2

    UCS-2はISO10646を2バイトで符号化する方法です。単にUNICODEといえばこの16ビットの符号化を指します。コード表は 0 ~ 1/0 F/F F/Fの領域を使い、約111万文字を扱えます。USC-2のエンコード方式として、UTF-16とUTF-7の2種類があります。

    UTF

    既存のネットワークなどはISO2022に準拠した文字データを処理することを前提にしていますので、UCSのデータをそのまま利用すると問題が生じます。そのため、UCSを問題なく利用できるようにいくつかのエンコード方式が考案されました。いくつかのエンコード方式を総称した呼び名が『UTF (UCS Transfer Format)』です。
    UTFのエンコーディングは、互換性を考慮してUCSのASCIIに当たる部分を通常のASCII
    コードに変換し、それ以外のコードをそれぞれの方式で変換します。

    UTF-7

    UTF-7は、インターネットで利用できるように ASCIIに当たる部分以外の2バイト文字を、Base64エンコードやuuencodeと似た方式によって7ビットで符号化するエンコード方式です。

    IANA による登録事項

    IANAに登録されているシフトJIS、JIS、EUC-JPの正式名と別名の一覧です。

    名称 別名
    ISO-2022-JP
    (推奨)
    csISO2022JP
    Shift_JIS
    (推奨)
    MS_Kanji
    csShiftJIS
    Extended_UNIX_Code_Packed_Format_
    for_Japanese
    csEUCPkdFmtJapanese
    EUC-JP (推奨)

    参考サイト

関連記事