KID's World
 

おしながき
トップページ
プログラミング
研究
いんすぴ
色日記
ソフトウェア
KID's Worldの歴史
リンク
小出俊夫について


漢字がうまく処理できません。半角英数と漢字はどう違うのですか?

漢字は内部でどのように扱われているのかを知る

 

 漢字がうまく処理できない理由は、大きく分けると二つに分かれます。

  1. エンコード、フォント、OSなどに問題がある
  2. 漢字一文字を8bitとして考えてプログラミングしている

どちらが原因かは、実際にソースコードを見たり、OSや実行環境を調べてみないと分かりません。どちらかではなく、その両方に原因が場合もあります。まず、漢字についての基礎知識から学んで、原因を探ってみましょう。

 

漢字の基礎知識

 半角英数字は、char型の変数へ代入することができます。これは以前「変数とは何なのか」で詳しく解説したように、半角英数字などの1バイト文字は、0〜255までの数字で表されています。ソースコード上で 'A' と書いた場合は、これは文字ではなく、数字として扱われます。たとえば、「c = 'A' + 10;」と書くことができ、char型変数 c には 'K' が入ります。

 コンピュータができた当時は、英数字のみで漢字は表示することはできませんでした。よって文字型としては0〜255までの数を表現できる8bitで十分すぎたぐらいなのです。そしてそのアーキテクチャを引きずったまま現在にいたっています。しかし漢字はそうはいきません。誰もが知っているように、漢字の文字数は255文字をはるかに超えています。もしあなたが上司から「きみ、このコンピュータで漢字を表示できるようにしてくれたまえ」と言われたら、どうやって実現させますか?

 そんなのできるわきゃないだろーよ、とコンピュータを破壊してしまうのもひとつの手ですが、ちょっと待ってください。文字コード表とにらめっこしてみましょう。アメリカで決められた規格であるASCIIコード表には、0〜127までが英数字や制御文字として定義されていますが、あと半分の128〜255までの定義がありません。これを何とかうまく使うことはできないでしょうか。

 どうやら文字を画面に表示するプログラムを細工してみればうまくできそうです。上に書いたような定義されていない文字を受け取ったら、もう一つ文字がやってくるのを待って、受け取ったらその二文字に割り当てられた漢字一文字を画面に表示するように作ります。これで、今までのままで、画面に文字を表示するプログラムを変えるだけで、漢字が扱えるようになりました。これで上司にも誉められます。

 二文字必要だったのは、128個では漢字を全部あらわすことができないからです。それにあとからもう一つの文字(0〜255)を組み合わせれば、単純計算で128×256で、32768文字をあらわすことができます。実はWindowsやMacOSなどで採用されているShiftJIS、そしてUNIXなどで使われているEUCというコード体系も、基本的にはこのような方法で漢字や記号をあらわしています(わざと使わない部分や、半角カタカナの処理など、細かい部分ではもっといろいろな決まりがありますが)。

 つまり、簡単にいってしまえば、漢字はchar型変数二つであらわすことができるということです。これが、漢字や記号などの全角文字が2バイト文字と言われるゆえんです。

 

エンコード、フォント、OSなどの問題

 では本題に戻り、C言語で漢字がうまく使えないときは、どのような原因が考えられるのでしょうか。MacOSやUNIXで多いのは、「フォント」の問題です。MacOSには英語版のCコンパイラが多く、実行時に日本語の表示できないフォントで表示している場合があります。もし表示フォントが日本語フォントに変更できれば、それで解決する場合があります。しかし、単純に一文字ずつ表示しているために右側で折り返すときに、途中で分割されて文字化けしてしまう場合があります。また、最初からコンパイラ(実行環境)が8bit目を考慮せずに作っていたり、表示するときに一気に表示せずに一文字ずつグラフィックとして表示していたりする場合は、日本語フォントにしても意味がなく、これもまったく手出しができません。

 UNIXでうまく漢字が使えない場合は、先ほどのフォントの問題に加えて、エンコードの問題があります。UNIXではEUCが多く使われているため、端末の設定をShiftJISなどにしていると、文字化けしてまったく読めなくなってしまいます。さらに、Xで日本語を表示するときは、そのまま表示してもだめで、関数で特有の文字列形式(コンパウンドストリングとかいったかな? 忘れてしまった(^-^;;)に変換してから表示する必要があります。詳しいことは、X関連のプログラミングの書籍をご覧ください。

 MS-DOSやWindowsでは、幸い日本語に対応したコンパイラが数多くあるために、こういった原因による問題はあまり見かけませんが、あなたがもし英語版の開発環境を使っている場合は注意したほうがよいでしょう。

 このように、プログラム自体には誤りがなく、それを実行する環境によって漢字が表示できなかったり、特殊な処理が必要だったりする場合があります。この場合は、プログラムをいくら眺めても、解決はしません。

 

漢字は2バイト文字です

 次に、プログラムの問題です。漢字は2バイトの文字ですので、100文字の漢字を扱いたければ、200バイトの領域が必要です。つまり、「あいうえお」という文字は、最後の'\0'まで含めて11バイト必要ですので、配列で扱う場合には、「char c[5];」ではなく、「char c[11];」としなくてはなりません。

 また、2バイト文字の考慮をしていないがために、途中で分割してしまったりして意味のない文字になってしまう場合もあるので、常に二つの文字を一つのセットとして考えてプログラムを組まなくてはなりません。

 以下に、サンプルのコードを書いておきます。これは、入力された1文字の2バイト文字のコードを16進数で表示するものです。


#include <stdio.h>

void main()
{
  unsigned char c1,c2;

  scanf("%c%c",&c1,&c2);
  printf("%02X %02X\n",c1,c2);
}

(1999/09/05 公開)

 

[質問インデックス]

 著作権は全て小出 俊夫にあります。KID's World © 1996-2003 Toshio Koide.

 対応ブラウザについて