【6日でできるC言語入門】文字コード

 C言語で「文字」を扱うとき、実際には数値(文字コード)として保存・処理されます。これはコンピュータが数字しか直接扱えないためであり、「A」や「a」や「1」などの文字もすべて“コード番号”として管理されています。
 ここでは、文字コードの基本、ASCIIや制御コードの意味、さらに国際化に伴う各種文字コード(Shift_JIS, UTF-8, EUCなど)について、C言語プログラムの具体例とともに解説します。

1.文字コードの基本とASCII

1.1. 文字コードとは

「文字コード」とは、文字と数値の対応表です。たとえば「A」は65、「B」は66…という具合に、
どんな文字も“固有の数値”に変換できます。
C言語ではchar型変数に1文字分の数値(-128~127 or 0~255)を保存します。

文字コードの例(ASCII表の一部)

文字10進数16進数備考
A650x41英大文字
B660x42英大文字
a970x61英小文字
0480x30数字
@640x40記号
空白320x20Space(SPC)

1.2. ASCIIコードと制御文字

ASCII(アスキー)コードは、米国で生まれた基本の文字コードです。
英数字・記号・制御文字を127種類(0~127)で表します。

主なASCII制御コードの例

10進数16進数コードフルスペル意味・用法
00x00NULNull文字列の終端
70x07BELBell警告音
80x08BSBack Spaceバックスペース
90x09HTHorizontal Tabタブ
100x0ALFLine Feed改行(\n)
130x0DCRCarriage Return復帰(\r)
270x1BESCEscapeエスケープ
320x20SPCSpace空白文字
1270x7FDELDelete削除

2.C言語での文字コードの扱い

2.1. 文字・文字コードの出力例

 C言語では、char型変数に文字を代入した場合、実際にはその「文字コード(数値)」が保存されています。

サンプルプログラム1:文字と文字コードの対応を確認

プロジェクト/ファイル名: Lesson35_1/main.c

#include <stdio.h>

int main(void) {
    char ch = 'X';
    printf("文字: %c\n", ch);
    printf("10進コード: %d\n", ch);
    printf("16進コード: 0x%X\n", ch);
    return 0;
}

実行結果

文字: X
10進コード: 88
16進コード: 0x58

2.2. 文字コード表を利用するC言語サンプル

サンプルプログラム2:A~Zの文字とコードを表示

プロジェクト/ファイル名: Lesson35_2/main.c

#include <stdio.h>
int main(void) {
    char c;
    for (c = 'A'; c <= 'Z'; c++) {
        printf("'%c': %d  ", c, c);
    }
    printf("\n");
    return 0;
}

実行結果

'A': 65  'B': 66  'C': 67  'D': 68  'E': 69  'F': 70  'G': 71  'H': 72  
'I': 73  'J': 74  'K': 75  'L': 76  'M': 77  'N': 78  'O': 79  'P': 80  
'Q': 81  'R': 82  'S': 83  'T': 84  'U': 85  'V': 86  'W': 87  'X': 88  
'Y': 89  'Z': 90

3.日本語・多言語と文字コード

3.1. 多言語を扱うための文字コード

もともとASCIIは英語圏専用で、日本語など多言語のサポートはありませんでした。
その後、日本語や各国語を扱うための「マルチバイト文字コード」が登場します。

名前概要特徴
Shift_JISJIS規格。Windows日本語で標準的2バイトでひらがな・漢字等
EUC-JPUNIX系OSで利用。日本語の標準2バイトで日本語等
UTF-8Unicode。世界中の文字を可変長バイトで表現世界標準。ASCII互換あり

3.2. UTF-8とC言語

 UTF-8は世界標準の文字コードで、ASCII互換性もあり、英語・日本語・絵文字も一つの方式で表現できます。
 C言語の標準入出力関数(printfscanfなど)は、1バイト単位で文字を処理するため、日本語や多バイト文字を正確に扱うには工夫や専用ライブラリが必要になることがあります。

4.文字コードを意識したプログラム例

サンプルプログラム3:文字コードで文字の判定

プロジェクト/ファイル名: Lesson35_3/main.c

#include <stdio.h>
int main(void) {
    char c;
    printf("1文字入力してください:");
    scanf(" %c", &c);

    if (c >= 65 && c <= 90) { // 'A'~'Z'
        printf("英大文字です。\n");
    } else if (c >= 97 && c <= 122) { // 'a'~'z'
        printf("英小文字です。\n");
    } else {
        printf("その他の文字です。\n");
    }
    return 0;
}

実行結果

「SDLチェック」を「いいえ」にして、プログラムを実行します。

1文字入力してください:A
英大文字です。

まとめ

  • 文字コードは、文字と数値を対応させるルール
  • C言語ではchar型変数で1文字=1バイトのコードを保存
  • ASCIIが基本だが、国際化のためShift_JIS、UTF-8なども普及
  • 文字コードの理解はC言語で文字列・データ処理を行う上で必須!