文字符号化

任意の文字を表示する方法を説明する.計算機では文字は整数値で表現される.std::cout などは,数値がintの変数に格納された状態で渡される,あるいは直接指定された場合は,その数値を画面に表示する.これ以外に,char の変数に格納された値が渡された場合は,その値に対応した文字を画面に表示する,ということになっている.char も int も同じ整数値を格納する変数であるが,このように std::cout に渡された場合に挙動が異なる.

以下にこの例を示すコードと実行結果を示す.c.cpp としてファイルは保存した.

#include <iostream>

int main(){
    int ia = 97;
    char ca = 97;
    std::cout << ia << char(10);
    std::cout << ca << char(10);
    return 0;
}
[shibata@127 cpp]$ g++ c.cpp [shibata@127 cpp]$ ./a.out 97 a

2つめの出力は,数字の97ではなく,文字のaが出力されていることを確認できる.floating-point.htmlで指定していた,char(10)というのは,改行を出力するというもので,これも一つの文字として扱われる.次のように書いても動作は同じである.ついでに,32で空白が表示できることも示してある.出力も併記する.

#include <iostream>

int main(){
    int ia = 97;
    char ca = 97;
    char cb = 98;
    char lb = 10;
    char space = 32;
    std::cout << ia << lb;
    std::cout << ca << lb;
    std::cout << ca << space << ca << space << cb << lb;
    return 0;
}
[shibata@127 cpp]$ ./a.out 97 a a a b

97から122まではaからzが対応する.このことを考えれば,やかましいかもしれないが,以下のコードにより繰り返し分で小文字のalphabetをすべて出力することができる.出力も併記する.

#include <iostream>

int main(){
    char ca = 97;
    char lb = 10;
    char i=0;
    char t;
    while(i < 26){
        t = ca + i;
        std::cout << t;
        i = i + 1;
    }
    std::cout << lb;
    return 0;
}
[shibata@127 cpp]$ ./a.out abcdefghijklmnopqrstuvwxyz

このような文字に対応付けられた数値を文字符号(文字コード)という.

数値を指定するのは大変であるため,文字を記載してコンパイラに数値へ変換させることが可能である.これは,'a'のように,単引用符''で囲むことで表現する.次に例を示す.

#include <iostream>

int main(){
    int ia = 'a';
    char ca = 'a';
    char cA = 'A';
    char space = ' '; // char space = 32 と同義.
    char lb = '\n'; // char lb = 10 と同義.
    std::cout << ia << space << ca << space << cA << lb;
    return 0;
}

このような見てわかる文字符号の表現を文字リテラル(character literal)と呼ぶ.

ここまでの方法で,英数字ならば表示が可能となる.だが,複数の文字を表示するために変数をその分だけ用意するのは大変である.また,日本語はこの方法で表示することができない.この問題に対して,まとめて「文字の列」なるものを表現して std::cout へ渡す方法が存在する.これを使うには,配列と呼ばれる概念を理解しなければならない.次の節以降でこれを説明する.