キャラクタ (コンピュータ)

キャラクタ (英: character) は、文字のことであるが、情報処理においては「文字コード」で表される「文字集合」という集合の要素（「元」）のことである。

概要

コンピュータの情報交換においてテキストデータをやりとりする場合は、双方がそれに使用する文字集合を決めて通信を行う。キャラクタはその場合の最小単位である。
キャラクタは大きく分けて図形文字（グラフィックキャラクタ）と制御文字（コントロールキャラクタ）がある。図形文字が実際に画面に表示される文字であり、制御文字はその表示の仕方を制御する改行記号などや、それにとどまらずビープ音を発生させるものなどを含む。
図形文字には、言語学的な意味での文字記号（字母）以外に、約物類を含む。さらに、1つのキャラクタが1つの字母を表すとは限らない。文字コードにもよるが、「㍍」のような組文字のキャラクタは複数の字母からなり、逆に、「Å」のようなアクサン付きアルファベットなどは複数のキャラクタで表されることもある。

キャラクタとバイト

キャラクタの符号化（文字符号化方式）に、バイト（この段落ではオクテットと同義）を当てるという標準を確立し広く普及したのはIBMが1964年4月に発表したメインフレームのSystem/360による（それ以前については#歴史の節を参照）。当初のアナウンスでは制定されたばかりのASCIIが採用されるはずだった。しかし、結果的には過去のしがらみを振り切ることができず、メインフレーム用としてはEBCDICが普及した。なお、一応System/360はモードを切り替えることはできる。
C言語およびC++での文字型の名前はcharだが、このcharはバイトやオクテットと等価ではない。C/C++のchar型の幅は<limits.h>/<climits>をインクルードすることで定義されるCHAR_BITSというマクロで示され、実際の数値は8ではなく9や16の可能性もある。なお、最低限必要とされている値の範囲の関係で8未満にはならない。sizeof(char)は常に1である。
幅を規定した整数型としてはC99およびC++11で追加されたint8_t/uint8_tおよびstd::int8_t/std::uint8_tがある。バイトは8ビットすなわちオクテットではない可能性もある。
JavaやC#のcharは16ビットであり、内部表現はUTF-16と規定されている。
コンピュータの普及が米国に次いで早かった日本では、日常の生活や業務に漢字が必須であるため、256より多くのキャラクタを扱いたいという要求が強かった。そこで現れたのが、1つのキャラクタを複数のバイトで表すマルチバイト文字（MBC）である。特に初期には2バイトを使うものがほとんどであり、ダブルバイト文字（DBC）と言った。
また、米国以外の国や地域で、それぞれに必要な文字を追加した文字集合や文字コードを作ったため、多数の文字集合や文字コードが乱立する結果となった。Unicodeはその問題を解消し、文字集合を統一するために生まれた。
現在ではキャラクタとデータの関係は抽象化されている。キャラクタは整数値（通常非負整数）で表現され、その整数値から文字符号化方式によりバイト列が生成される。たとえばUnicodeではUnicodeスカラ値という値が、各キャラクタに付けられている。

初期のコンピュータ

初期（1940年代～1960年代前半）のコンピュータにおける「キャラクタ」について述べる。
初期のコンピュータでは、入出力媒体として、コンピュータ以前から存在していた情報処理機械であるタビュレーティングマシン用のパンチカードや、テレタイプ電信網（テレックス）用の紙テープが使用されていた。そのため、それらにおける1カラム、ないし1列の5ビット～7ビットのコードが1文字（1字）だった。
また、System/360より前のコンピュータは、使用する分野ごとに設計が違うのが通常で、主に科学技術計算用と事務処理用に分かれていた。それぞれの典型的な設計を示すと、科学技術計算用は40ビット前後のワード長で、ワードアドレッシングで、ワード単位の演算を得意とするワードマシンだった。これに対し、事務処理用は字（前述の紙テープなどの1文字）単位のアドレッシング、ないし4字ないし6字を1ワードとしたワードアドレッシングで、字単位の処理を得意とするキャラクタマシンだった。
System/360により、バイトマシンが標準となった。

キャラクタディスプレイ

通常のラスタースキャン方式のディスプレイでは、表示する際に、ピクセル毎にその輝度を決定する必要がある。RAMが高価だった時代、コンピュータで使用したのは主にコマンドラインインターフェースであり、文字情報しか表示しないものにディスプレイ全面のピクセルに対応するRAM（VRAM）を用意するのはコストが合わなかった。そのため、ある一定の大きさ（8*8など）のドットマトリクスごとに1バイトの記憶領域を割り当てて、VRAMの容量を節約するキャラクタディスプレイが一般的だった。また、それに合わせたディスプレイコントローラーが使用された。現在のPC/AT互換機のチップセットにもこのような表示用の機能が残っており、BIOS画面等で使用しているものもある。
日本製パーソナルコンピュータの黎明期にも多くの機種は同様の構造を持っており、テキストVRAMの値を基準としてキャラクタディスプレイが行われていた。多くの場合、8×8ピクセルで構成されたパターンがあらかじめ定義されたキャラクタジェネレータROMを本体に持っており、大文字、小文字のアルファベット、数字、カタカナに加え、記号が定義された。記号の中には、4×4ピクセルのパターンを定義することで、それを配置することによって擬似的に図形等を表示し「セミグラフィックス」と呼称していた。記号部分については、機種によって様々であり、曜日の定義や、ゲームに使うようなキャラクター、トランプのスートなど様々なものがあり、ひらがなのパターンを持つ機種も存在する。
キャラクタディスプレイのみという制限を補完するため、テキストVRAMには、別途アトリビュート領域が設けられることが多く、表示色、背景色、ブリンク等の指定を、複数キャラクタ毎またはキャラクタ毎に指定することが可能になっていた。
各キャラクタ群のみの組み合わせて絵を書くことをアスキーアートと呼ぶことがある他、アトリビュートなどを併用したこれらのテキスト画面によって描かれた絵をキャラクターグラフィックと呼んだ。
MZ-700にはグラフィック用のVRAMはないものの、テキスト、背景の色をキャラクタ単位で指定できるため、これらを応用し、チェッカを用いたディザリングをはじめとする方法によって描画する試みもあった。
これらの手法は、解像度は低い反面、非力なCPUでもダイナミックな描画を実現できるというメリットもあった。
グラフィックスプレーンを持つことが可能になった時期には、文字の描画をサブプロセッサと、その周辺回路に持たせ、グラフィックスプレーンに直接描画するという実装もあった。その場合でもこのテキストVRAMに相当するエリアは存在しており、「文字コードのみ」でテキストを扱う手段は存在している。
英語圏や、英数字のみを扱う場合には有用なこれらの実装は、日本語を取り扱うには、大きな制限となった。多くの機種では、グラフィックスプレーンに対し、漢字ROMを併用することで、ソフトウェアでROM内のパターンを描画していたが、ハードウェア的に拡張されたテキストプレーンを追加し、キャラクタディスプレイの形で漢字表示を実現している機種も存在する。
8ビット機では、X1turbo、MZ-2500。16ビット機ではPC-9801シリーズがこれらの仕組みを持っており、キャラクタとして漢字を取り扱うことで、グラフィックスプレーンに描画するよりも高速に処理することが可能になっており、PC-9801シリーズが日本で普及した一因ともいわれている。
ただし、この実装では、画面に展開するフォントを本体に持っている必要があり、ROM、RAM等のメモリが高価な時代では、オプションであったり、JIS一次水準のみが実装されているケースもあり、そのばあい、本体に含まれないフォントについては正常に表示されないことになる。

PCG

キャラクタのパターンをROMではなくRAMに保存して書き換え可能にした機能をPCG(Programmable Character Generator:プログラマブル・キャラクタ・ジェネレータ)と称したメーカーもあった。ファミコン等におけるタイリング背景もこれに相当する。定義できる物は単色から、8色まで様々である。
PCGはキャラクタ単位で管理されるため、定義されたデータを変更した場合、テキストVRAMに定義された表示されるキャラクタに反映されるため、点在する物を同時に書き換えることも可能である。これらを利用し、別パターンを定義することによって、擬似的にスクロールをおこなったり、波や、星、水、川の流れ、を表現したり、画面のワイプ処理などに利用する事が可能である。
また、X1のグラフィックVRAMの並びもこれに近く、MZ-1500に至っては、画面全体にキャラクタを並べ、パーツの書き換えによってグラフィック描画を実現している。
フォントROMを使用した、ハードウェアによる文字表示を行っている表示系で、外字機能のために、一部の領域（たとえばPC-9801のある世代以降ではJISの86区と87区に相当する部分）が書き換え可能なRAMになっているものがあった。これも一種のPCGと言える。PC-9801では、文字を、グラフィックの上にスーパーインポーズのようにして表示できたため、ゲームなどでこれを使用しているものがあった。