キャラクタ (英: 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である。バイトは8ビットすなわちオクテットではない可能性もある。
幅を規定した整数型としてはC99およびC++11で追加されたint8_t
/uint8_t
およびstd::int8_t
/std::uint8_t
がある。C++20ではUTF-8でエンコードされた文字を格納することを想定した符号なし文字型として、char8_t
が規定されたが、8ビット幅であるとは限らない[1]。
JavaやC#のchar
は16ビットであり、内部表現はUTF-16と規定されている[2][3]。
コンピュータの普及が米国に次いで早かった[要出典]日本では、日常の生活や業務に漢字が必須であるため、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第1水準のみが実装されているケースもあり、その場合、本体に含まれないフォントについては正常に表示されないことになる。
PCG
キャラクタのパターンをROMではなくRAMに保存して書き換え可能にした機能をプログラマブル・キャラクタ・ジェネレータ (Programmable Character Generator: PCG) と称したメーカーもあった。初期のアーケード基板やファミリーコンピュータ等のゲーム機におけるタイリング背景も機能や実装としては近似するが、これらの場合はソフトウェアカートリッジなどとセットでROMに書き込まれたものを使用する形であることも多かった。
PCGはキャラクタ単位で管理されるため、定義されたデータを変更した場合、テキストVRAMに定義された表示されるキャラクタに反映されるため、点在する物を同時に書き換えることも可能である。これらを利用し、表示パターン側を再定義することによって、擬似的なスムーススクロールや多重スクロールや、波や、星、水、川の流れ、を表現したり、画面のワイプ処理などに利用することが可能である。
また、初代MSX規格やMZ-1500等ではテキスト画面を拡張する形でグラフィックス表示にも用いられており、前者は画面を三分割にし、画面上の上中下に相当する部分ごとに256種類のパターンと1ラインにつき2色、後者は1024個の定義パターンを任意に配置することでピクセルごとに8色の中から任意の色でのビットマップ表示を実現している。
X1ではピクセルごとに8色中任意の色で定義できるパターンを256種持つことができ、上記の機種とは異なりグラフィックスプレーンと重ねて表示することが可能であった。
尚、これらの実装ではパターン書き換えのタイミングには他の回路との調停もあり短時間にダイナミックな変更は難しい物となっていた。
フォントROMを使用した、ハードウェアによる文字表示を行っている表示系で、外字機能のために、一部の領域(たとえばPC-9801のある世代以降ではJISの86区と87区に相当する部分)が書き換え可能なRAMになっているものがあった。これも一種のPCGと言える。PC-9801では、文字を、グラフィックの上にスーパーインポーズのようにして表示できたため、ゲームなどでこれを使用しているものがあった。
スプライト
文字(当記事における意味)に由来するのか、それともゲーム等のキャラクターに由来するのかは定かではないが、主に2Dのコンピュータゲームにおいて、キャラクター表示に用いられるスプライトや、タイル状に敷き詰められ背景表示に用いられるPCG・BGレイヤーなど、繰り返し表示機能向けに定義されたビットマップ画像をキャラクタもしくはパターンと呼ぶ。「スプライトパターン」や「BGパターン」、あるいはまとめて「キャラクタパターン」「グラフィックパターン」など。
また、パラパラマンガのようにアニメーションするよう描かれた一連の画像や表示シークエンスは「アニメーションパターン」と呼ばれる。典型的なアニメーションパターンは、俗に「爆発パターン」「やられパターン」などと呼ばれることがある。
脚注
関連項目