【番外編】ICT環境における文字情報の表現

このstepでは、文字情報(テキスト)がパソコンやインターネットなどICT環境の中ではどのように表現されているかを学ぶ。これらは講座の最終ステップではなく、準備段階である。受講生の方々の学習経験や予備知識の有無をみながら、必要に応じて講座に組み入れていく。

文字の表現

コンピュータは、文字、画像、音声などさまざまな表現メディアによる情報を扱えるが、CPU(中央処理装置)が扱うことができるデータは、2進数の数値情報だけである。したがって、数値以外の情報を扱う場合は、それらをいったん数値情報に変換して処理し、計算結果を元の形式に逆変換しなければならない。そのため、各種情報と数値情報との変換規則が必要だが、それをコード(code)※1とかフォーマット(format)と呼ぶ。

1 codeは「規約」とか、もっと重々しく「法典」を指す。「目には目を、歯には歯を」のハムラビ法典はCode of Hammurabiだ。

このうち、文字情報と数値情報を相互変換する規則は、文字コードという。
テキストの最小単位は、1個の文字である。ICTでは、すべての文字は文字コードによって数値に変換されて処理される。文字から変換された数値自体も文字コードと呼ばれる。これには大別してつぎの2種類がある。

1BYTEコード
アルファベット、数字、記号などを表現する文字コード。ASCII、EBCDICなどの種類があるが、WindowsではASCII文字コードが用いられている。
多BYTEコード
日本語中国語など、256種類を超える文字をもつ言語は、1BYTEコードでは表せないので、2BYTE以上の文字コードが使われる。日本語に対するコードとしては、以下のような種類がある。
JISコード
 JIS(日本工業規格)やISO(国際標準規格)で規定されている、2BYTE文字コード
Shift-JISコード
 日本のパソコンで広く用いられている2BYTE文字コード。JISコードをASCIIコードと混在して使用する際の不便を解決するために開発された。
EUCコード
 Linux系のワークステーションなどで用いられている2BYTE文字コード。Shift-JISコードと同様の動機で開発された
Unicode
 世界中のすべての文字を共通の文字集合で表現するために開発されたマルチBYTEの文字コード。Windowsパソコンの内部処理など、主要な用途に広く用いられている。pythonでは、Unicodeの、UTF-8という文字符号化スキームを利用して日本語を扱う

ASCII文字コード

まず、英数字を表現するためのASCII文字コードについて学ぶ。図1にASCII文字コード表を示す。

図1: ASCII文字コード表(参考:IT用語辞典)

たとえばAは10進数の65、16進数の0x41と対応する。この講座では16進数表記で統一しよう。メモリ上の1BYTEに書かれた「0x41」が数と文字のどちらを表すのかは(画像や音声の一部かもしれない)、データ自体から判断できないので、プログラム側で区別するしかない。
図1から分かるように、1BYTEコードと言っても、英数字や記号類には128種類の文字で十分なので、ASCIIコードのMSB(最上位ビット)は常に0である。この性質は、Shift-JISコードと混用する場合に重要になる。
ICTにおける「文字」には、一般通念では文字でないものも含まれている。たとえば、SP(0x20)空白文字である。2バイトコードの全角空白と区別するために、半角空白と呼ばれる。これがないと、文字列中に間隔を開けられず、単語さえ区切れなくなってしまう。
また、赤字で書かれた33種類の文字は、コンピュータやネットワークを制御する制御文字である。現在では使われていないものも多いので、以下のものを知っておけば十分だ。

NUL(0x00)
ヌル文字。「ヌル・ターミネータ」として、文字列の終わりを示すことなどに使う
HT(0x09)
水平タブ。タブストップ位置までカーソルを右に進める
NL(LF:0x0a)
改行(ラインフィード)。Linux系OSではNLのみで改行を表す
CR(0x0d)
キャリッジリターン。カーソルを先頭位置に戻す。Windows OSではCR+LFで改行を表す
SO(0x0e)
シフトアウト。7ビット文字しか使えない環境で、半角カナ文字の終わりを宣言するのが元々の機能だが、JISとASCIIの文字を混用する際にも用いられ、JIS文字列の終わりを意味する
SI(0x0f)
シフトイン。7ビット文字しか使えない環境で、ASCIIから半角カナ文字への切替を宣言するのが元々の機能だが、JISとASCIIの文字を混用する際にも用いられ、JIS文字列の始まりを意味する
SUB(EOF:0x1a)
テキストファイルの終わりを表す
ESC(0x1b)
エスケープ。特殊機能を割り付けたエスケープシーケンスの始まりを示す

演習:英数字文字列のコード化

自分の名前をアルファベット表記した文字列を、ASCIIコードに変換してみよう。


例:
Y    O         Y    A    M    A    N    O    G    U    C    H    I    \0(NUL)
0x59 0x4f 0x20 0x59 0x41 0x4d 0x41 0x4e 0x4f 0x47 0x55 0x43 0x48 0x49 0x00
この14文字の文字列は、14 + 1 = 15 BYTEのBYTE列で表現される。「ASCIIコード」という「文字の規格」を前提にして、その上にASCIZ文字列※2という文字列の規格が成り立っている。

2 あまりセンスのよいネーミングではない。0で終端されたASCII文字列を意味するダジャレである。

文字列(string)とは文字の並びであり、典型的には「。」で区切られた1つの文や、改行で終わる1つの段落が、これにあたる。テキストファイル全体も、改行コードなどの制御文字を含んだ1つの文字列である。
文字列は、上記のASCIZ形式以外にも、文字コード列の直前に長さを表す数値を付けたデータで表現されることもある。データベースなどのアプリでは、文字列を実際にメモリに格納する前にサイズを知る必要が多いため、この形式が採用される。

Shift_JIS文字コードとUnicode

日本語文字コードは多BYTEコードであり、上述のようにいろいろあるが、この節ではWindowsパソコンのテキストファイルで広く使われているShift-JISコードについて説明する。Shift_JISコード表は6000文字以上を収録している巨大なもので、ここに図を掲載阿することもできないが、Windowsのユーティリティ文字コード表で調べられる。図2にその画面と使い方を示す。

図2: 文字コード表の画面と使い方

図は「山」の文字コードを調べているところである。

だとわかる。
Shift_JISコードは、国際標準規格※4であるJISコードの第1バイト(上位バイト)をずらして(シフトして)、MSBが常に1になるようにしたものである。このため、MSBが常に0になるASCII文字コードと自由に混在できる性質を持っている。第2バイトはASCII文字コードと衝突するが、第1バイトのMSBでコードを判別できるからだ※5。 これに対してJIS文字コードは、第1バイト、第2バイトともASCII文字コードと衝突するため、原理的にASCII文字コードと判別できない。したがって相互の切り替えには、制御文字SISO(前述)が用いられる。たとえば

ABC[SI]漢字だよ[SO]123
という具合だ。プログラム上のでの処理はたいへん煩雑にならざるを得ない。JISコードからShift_JISコードへの変換は、文字の並びを変えずに領域ごとシフトさせているので、簡単な数式で計算できる。図3に、JISコードとShift-JISコードのコード領域の関係を示す。

3 Unicodeとその文字符号化スキーム(UTF-8など)は、国際標準規格ISO/IEC 10646で定義されている。「文字符号化スキーム」については詳述する余裕がないが、上記「山」のUnicodeコード(符号位置)「U+5C71」というのはいわば「文字コード表のマス目番号」であり、そこからメモリ上の実際のバイト列への変換方式が「文字符号化スキーム」だと考えると少し分かりやすい。ちなみに「UTF-16 Big Endian」では「0x5C71」とそのままだが、「UTF-16 Little Endian」だと「0x715C」と反転するし、「UTF-8」だと「0xE5B1B1(3バイト)」というように、一見無関係に見えるくらい変形されてしまう。

4 JISコードは、ASCIIコードと同一の1 BYTEコード(英数字、半角カタカナ、記号)が日本工業規格(JIS)のJIS X0201で、漢字(全角文字)がJIS X0208で定義されている。また、国際標準規格ISO-2022-JPでも定義されている。Shift-JISコードは、長らく標準化対象外のデファクトスタンダードだったが、現在はJIS X0208またはJIS X0213の「附属書1」として一応の標準化がなされており、その意味でShift-JIS X 0213ともいう。文字コードの標準化をめぐるテーマはたいへん複雑かつ深遠なので、この講座ではこれ以上は説明しない。

5 2バイト文字コードなんか気にもしてないアメリケーンなアプリでは、それでも文字化けが起こる。特に第2バイトが\(0x5c)とかぶる文字(たとえばソ(0x835c))以降が正常に表示されないなどの問題が起こるので注意。

図3: JISコードとShift_JISコードのコード領域の関係

演習:日本語文字列のコード化

自分の名前を全角文字列で表記し、Shift-JISとUnicode(符号位置)に変換する。文字コードは文字コード表ユーティリティで調べること。


例:
山     之     口            洋     \0(NUL)
0x8e52 0x9456 0x8cfb 0x8140 0x976d 0x00      Shift_JISコード
0x5c71 0x4e4b 0x53e3 0x3000 0x6d0b 0x00      Unicode(符号位置)コード

この5文字の文字列は、どちらの文字コードでも、5 * 2 + 1 = 11 BYTEのBYTE列で表現される。これらもまたASCIZ文字列と呼ぶ。

電子化テキスト

文字コードで表現され、デジタル記録メディアに格納されたテキストデータを電子化テキストという。 世界には、CD、DVD、BD、HDD、SSD、磁気テープなどのデジタル記録メディア上に格納された、膨大な量のテキスト情報が存在する。そして、紙に活字などで記録されたアナログなテキスト情報も、依然として大量に存在する。これは非電子化テキストである。
私たちが知的生産活動を行う場合、当分の間(おそらくこれから数十年間)は、これら2種類のテキスト情報を併用しなくてはならない。そこで、相互変換や、テキスト情報を統一的に扱うICTスキルが必要になる。主なものを挙げる。

自炊
非電子化テキストを画像データとしてスキャンすること。情報学的に言えば、物質(紙とインク)を担荷体とするテキスト情報を、エネルギー(磁気など)を担荷体とする情報に担荷体変換することである。
活字OCR、手書きOCR
画像データから、電子化テキストに変換すること。
電子化ドキュメント(PDFなど)
紙の情報と電子の情報を一元的に管理するための技術。