今回は,テキスト・ファイル中にある文字の分布図を表示するWindowsアプリケーション,名づけて「TextDistributionAnalyzer(以下,TDA)」の作成を通して,Delphiの文字列操作を解説していきます。
![]() |
図1●今回作成するテキスト・ファイルの文字分布図表示ツール「TextDistributionAnalyzer」の動作画面 [画像のクリックで拡大表示] |
まずTDAの動作イメージをご覧ください(図1)。テキスト・ファイルを入力すると,TDAはその中に出現する文字を文字別にカウントします。後で説明しますが,日本語では通常,1文字を2バイトで表現します。この2バイトのうち,上位1バイトを縦軸,下位1バイトを横軸にとって,文字別のカウントを2次元の分布図として表示したのが図1です。モノクロではわかりませんが,文字の出現頻度に応じて色を変えて表示しています。文字コードの基礎を知っていると,意外なほど楽しく遊べます。筆者も作ってみて初めてわかりました。
今回はこのサンプルの作成を通じて,解説を進めていきます。Delphiで文字列を扱うときには必ず役立つでしょう。まず文字コードの基本と,Turbo Delphiの文字列型を解説します。そのあとで,TDAで利用するコンポーネントやコードを紹介します。
Delphiで扱う文字コードの基本
さて,文字とは一体なんでしょうか? 一般的な意味でいえば,ある特定の言葉や音を表現するために利用される記号,もしくは記号の集まりを指します。
これらの記号をコンピュータで扱うために考え出されたのが文字コードです。文字コードは「文字をコンピュータで表すための体系」のことです。例えば,日本語の「風」という文字は,「シフトJIS」という文字コードの体系で「9597」という数値(16進数)で表します。この「9597は風」という決まりの集まりが文字コードなのです。
文字コードの体系が1種類なら話が早いのですが,実は複数あります。ここでは,一般的に使用することの多い4種類を紹介しましょう(表1)。
表1●主な文字コード | ||||||||||
|
まず,先ほど例を挙げたシフトJISです。日本語のWindows上のファイルや画面では通常,このシフトJISを利用します*1。Delphiでも多くの場合,日本語の文字をシフトJISで表現しています。この文字コードは,「半角カナ」と呼ぶ特殊な文字を除いて,日本語1文字を2バイトで表します。
文字コードの二つ目は「EUC」です。Extended Unix Codeの略で,UNIX環境で一般的に使用されています*2。EUCも日本語は2バイトで表現します。
三つ目は「Unicode」です。日本語に限らず,中国語や韓国語など,世界中の様々な言語で利用される文字を,一つの文字コードで表してしまおうという壮大な試みを基に作られました。このような文字コードがあれば,あるプログラムを複数の国で使うときに,移植の手間が減って便利です。
しかし残念ながら,現在のUnicodeにはいくつかの問題があり,完全無欠の文字コードとはいえません。現在Unicodeは,Webなどネットワークに関連するプログラムでよく利用されています。WindowsにおけるUnicodeの実装では,1文字を2バイトで表現します。
最後は「ASCII」です。American Standard Code for Information Interchangeの略で,主に英語環境で使用します。一つの文字を7ビットで表し,アルファベットや数字,記号など基本的な文字セットを備えています。日本語の文字は表現できません。
シフトJISやUnicodeなどASCII以外の文字コードは,ASCIIで使用していない8ビット目($80番目以降)を使ったASCIIコードの拡張として実装されています。つまり,上で紹介した日本語を表現できる三つの文字コードでは,英数字や記号はすべてASCIIコード互換です。
これら三つの文字コードは,どれも日本語を表すために2バイト以上を使用します。ASCIIのように1バイト(正確には1バイト以下)で表現できる文字を「SBCS(Single Byte Character Set)」,シフトJISやUnicodeなどのように2バイト以上を使用する文字を「MBCS(Multi Byte Character Set)」といいます*3。
以上をまとめると,
・日本語Windows上では「シフトJIS」が一般的
・シフトJISでは,日本語1文字を2バイトで表現する
・シフトJISの英数字はASCII互換で,1バイトで表現する
となります。