情報の表現(文字)

  1. 情報の表現

    1. ビットとバイト

       電子計算機内部では、情報を電圧が「高い」か「低い」の二つの状態で表現します。この二つの状態を、「0」または「1」の二つの記号で表現します。「0」または「1」は数字の記号とは無関係です。この「0」または「1」の情報量を1ビットと呼び、情報量の単位とします。0,1 を数字として扱うときは2進数といいます。2進数での計算方法は次回詳しく説明します。
       計算機では、8個の「0」または「1」をまとめて1バイトといいます。初期に実用化された個人向け計算機(PC)が一度に処理した情報量は1バイトでした。現在でも小型の組み込み用コンピュータは1バイト単位で処理します。
       バイトは英数字1文字の単位にもなります。現在のPC内部の標準的な記憶量は 512M(メガ)〜2Gバイトです。また、磁気ディスクに記録される情報量は500G(ギガ)バイト〜1000GB(1TB)にもなります。
    2. 16進数

       1バイトの情報を表現する場合、0または1を8個並べて表記します。たとえば、
        01010 0011
      のようになります(便宜上4ビットで空白を入れました)。これでは、記号の数が多くて不便ですから、4ビットの記号を まとめて、次のように表記する場合があります。0000から1001までは数字で表記し、1010からは英字の ABCDEF で表記します。16種類のパターンを表現できますから、この表現法を「16進表現」といいます。
      0 1 2 3 4 5 6 7
      2進 0000 0001 0010 0011 0100 0101 0110 0111
      16進 0 1 2 3 4 5 6 7
      8 9 10 11 12 12 14 15
      2進 1000 1001 1010 1011 1100 1101 1110 1111
      16進 8 9 A B C D E F
      この16進表記を利用すると、1010 0011 は 「A3」 と2文字で表記できます。2進と16進表現を区別するため、先頭に、2進数の場合 0B 、16進数の場合 0X を付加する場合があります。0B10100011 と 0XA3 は同じ情報の表記です。X やBは小文字を利用する場合もあります。C言語では0xで始まる16進表記が利用できます。

    3. 演習

       1010 0101 と 1100 0011 に対する16進数を書きなさい
       D3 と 9A に対する2進数を書きなさい。

  2. 文字の表現

    1. 英数文字

       計算機での中心的な情報の表現形式は「文字」です。英数字1文字は1バイトで表現し、以下のような対応付けをします。この対応付けは文字コードと呼ばれ、世界的な標準になっています。日本では JISコード、アメリカでは ASCIIコード、国際的には ISO コードが制定されています。SP(0x20)はスペースです。
      文字 コード
      10進 16進
      NUL 0 0x00
      SOH 1 0x01
      STX 2 0x02
      ETX 3 0x03
      EOT 4 0x04
      ENQ 5 0x05
      ACK 6 0x06
      BEL 7 0x07
      BS 8 0x08
      HT 9 0x09
      NL* 10 0x0a
      VT 11 0x0b
      NP 12 0x0c
      CR 13 0x0d
      SO 14 0x0e
      SI 15 0x0f
      DLE 16 0x10
      DC1 17 0x11
      DC2 18 0x12
      DC3 19 0x13
      DC4 20 0x14
      NAK 21 0x15
      SYN 22 0x16
      ETB 23 0x17
      CAN 24 0x18
      EM 25 0x19
      SUB 26 0x1a
      ESC 27 0x1b
      FS 28 0x1c
      GS 29 0x1d
      RS 30 0x1e
      US 31 0x1f
      文字 コード
      10進 16進
      SP 32 0x20
      ! 33 0x21
      " 34 0x22
      # 35 0x23
      $ 36 0x24
      % 37 0x25
      & 38 0x26
      ' 39 0x27
      ( 40 0x28
      ) 41 0x29
      * 42 0x2a
      + 43 0x2b
      , 44 0x2c
      - 45 0x2d
      . 46 0x2e
      / 47 0x2f
      0 48 0x30
      1 49 0x31
      2 50 0x32
      3 51 0x33
      4 52 0x34
      5 53 0x35
      6 54 0x36
      7 55 0x37
      8 56 0x38
      9 57 0x39
      : 58 0x3a
      ; 59 0x3b
      < 60 0x3c
      = 61 0x3d
      > 62 0x3e
      ? 63 0x3f
      文字 コード
      10進 16進
      @ 64 0x40
      A 65 0x41
      B 66 0x42
      C 67 0x43
      D 68 0x44
      E 69 0x45
      F 70 0x46
      G 71 0x47
      H 72 0x48
      I 73 0x49
      J 74 0x4a
      K 75 0x4b
      L 76 0x4c
      M 77 0x4d
      N 78 0x4e
      O 79 0x4f
      P 80 0x50
      Q 81 0x51
      R 82 0x52
      S 83 0x53
      T 84 0x54
      U 85 0x55
      V 86 0x56
      W 87 0x57
      X 88 0x58
      Y 89 0x59
      Z 90 0x5a
      [ 91 0x5b
      \ 92 0x5c
      ] 93 0x5d
      ^ 94 0x5e
      _ 95 0x5f
      文字 コード
      10進 16進
      ` 96 0x60
      a 97 0x61
      b 98 0x62
      c 99 0x63
      d 100 0x64
      e 101 0x65
      f 102 0x66
      g 103 0x67
      h 104 0x68
      i 105 0x69
      j 106 0x6a
      k 107 0x6b
      l 108 0x6c
      m 109 0x6d
      n 110 0x6e
      o 111 0x6f
      p 112 0x70
      q 113 0x71
      r 114 0x72
      s 115 0x73
      t 116 0x74
      u 117 0x75
      v 118 0x76
      w 119 0x77
      x 120 0x78
      y 121 0x79
      z 122 0x7a
      { 123 0x7b
      | 124 0x7c
      } 125 0x7d
      ~ 126 0x7e
      DEL 127 0x7f
      文字列は、他の表記と区別する場合、"moji" のように、" で囲んで表記します。"moji" は16進表記では
           0X6d6f6a69 
      となります。0x00〜0x1f、0xff は 制御文字 と呼ばれ、記号で表現される他の文字(図形文字)と区別されます。0x20 は空白(Space)を意味します。制御文字のうち、BS(0X08)、CR(0X0d)、DEL(0x7f) は BackSpace(1文字戻る)、CarriageReturn(CR:行頭に戻る)、Delete(削除)を意味し、よく利用されます。 
       たとえば、"ABC" CR "123" は
      ABC
      123
      の2行を意味します。CR は「Enter」とも表記されます。
    2. 演習

      chukyo に対する文字コードを16進数で表現しなさい。
    3. 漢字の表現

       漢字を表記するには1バイトでは不足するため2バイトを利用します。漢字の各文字の計算機の内部表現の標準的な対応付けは JIS で定められています。一部の漢字コード(JIS X 0208)を紹介します。SJIS や EUC については後で紹介します。
            JIS  SJIS EUC   +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
      16区  3020 889E B0A0     亜 唖 娃 阿 哀 愛 挨 姶 逢 葵 茜 穐 悪 握 渥
      16区  3030 88AE B0B0  旭 葦 芦 鯵 梓 圧 斡 扱 宛 姐 虻 飴 絢 綾 鮎 或
      16区  3040 88BE B0C0  粟 袷 安 庵 按 暗 案 闇 鞍 杏 以 伊 位 依 偉 囲
      16区  3050 88CE B0D0  夷 委 威 尉 惟 意 慰 易 椅 為 畏 異 移 維 緯 胃
      16区  3060 88DE B0E0  萎 衣 謂 違 遺 医 井 亥 域 育 郁 磯 一 壱 溢 逸
      16区  3070 88EE B0F0  稲 茨 芋 鰯 允 印 咽 員 因 姻 引 飲 淫 胤 蔭   
      JISは各行の漢字の先頭の文字の16進コードです。例えば、「愛」 のコードは 0x3020+6 = 0x3026 となります。JIS漢字コードは、英数コードと重複すると区別ができなくなります。このため、ASCII コードからJIS漢字コードに移動するためのコードが ESC "$B" 定められています。ESC は0x1B の制御文字です。また、 ESC "(B" でASCII コードに戻ります。これを、「ESC シーケンス」 と読んでいます。
       ASCIIコードは 半角コード、漢字コードを全角コード とよぶこともあります。半角コードは全角コードの半分の幅で表示できます。
    4. シフトJISとEUCコード

       JIS 漢字コードでは、ASCIIコードと漢字コードが混在するとき、コード表を切り替える「ESC シーケンス」が必要です。これでは不便なため、Windows を開発したマイクロソフト社は 「シフトJIS」 と呼ばれる別の文字コード表を作成しました。これは、第一バイトをASCIIコードでは利用しない 0x80 以上とし、先頭バイトによりASCIIコードと漢字コードを区別しました。このコード表をシフトコードと呼びます。
       一方、Unix(ネットワークサーバーやの基本OS) 陣営では、EUC(Extended Unix Code) を採用しました。第一バイトが 0x80 以上になることは同じですが、JシフトJISより JIS漢字コードに近く、半角のカナコードが区別できるなどの特徴があります。
       
    5. UniCode、utf-8

       シフトJIS や EUC は日本の漢字コードにのみ対応しています。UniCode は世界の文字を統一的に表現することを目的に制定されました。これは、すべての記号を2バイト(一部4バイト)コードで表現します。2バイトコードでは、日中韓台 の同じ語源の漢字を同一コードで表現します。JIS 漢字コードとの規則性はなく、文字ごとに対応付ける必要があります。
       UniCode は Java 言語などでは標準の文字コードになっています。VisualCでも .net2005 より標準になりました。UniCodeは IMEパッド から見ることができます。IMEパッドは画面右下のタスクバーでIMEを右クリックし、文字一覧を選択して文字を表示します。左上で UniCode を選択します。世界中の「文字」とそのコードを見ることができます。


      utf-8 はUnicodeの表現形式の一種ですが、英字コードは1バイトでそのまま利用できるため、英語圏には便利な表記形式で情報交換(インターネット)などではよく利用されます。多くの漢字はunicodeでは2バイトですが、utf-8では3バイトが必要です。

      例 以下の2行は utf-8 では次のようになります。
      ito makoto
      伊藤誠
      utf-8 の16進表示:E4 BC E8 が ”伊”に相当します。
       69 74 6F 20 6D 61 6B 6F 74 6F 0D 0A E4 BC 8A E8
       97 A4 E8 AA A0 0D 0A A0 0D 0A 

    6. 文字コードの実験1

      文字コードの実験です。最初は文字コード(英数字)の実験で、連続文字を表示します。漢字コードは2バイト扱いなので文字列として扱います。2バイト目(kc[1])を増加すると連続文字が表示できます。
      //文字コードと文字 
      //漢字コードの実験
      #include "stdafx.h"
      
      int _tmain(int argc, _TCHAR* argv[])
      {
          char code=0x30;//code=48 でも同じ
          printf("%d:%c\n",code,code);
          //'0'から'Z'まで表示
          for(code='0';code <='Z'; code++)
                printf("%c",code);
          printf("\n");
         //漢字コード
         unsigned char kc[]="あ";//シフトJISでは0x82A0
         printf("%x%x:%s\n",kc[0],kc[1],kc);
         for(int i=0;i<9;i++){
            printf("%s",kc);
            kc[1]++;
          }
          printf("\n");
      
         return 0;
      }
      
      //実行結果
      //48:0
      //0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
      //82a0:あ
      //あぃいぅうぇえぉお

  3. その他の表現(参考)

    1. 画像の表現

       画像は「画素」と呼ばれる色のついた点の2次元の並びで表現します。各画素の色は、色の3原色である赤(Red)、緑(Green)、青(Blue)、に分解して記録します。各色の強さを1バイトで表現すると、3バイトで各画素を表現できます。例えば、鮮やかな黄色は、赤、緑、の成分が最大(255)、青が0ですから、(255,255,0) となります。これを 16進で表現すると 0xFFFF00 になります。
       画像は、行と列に並んだ「画素」と各画素の色で表現できます。このようなデータを記録したファイルを生(raw)画像ファイルといいます。Windows では BMP ファイルがこの形式です。横 640、縦 480 画素 の画面を1画素3バイトで記録するには 640*480*3 バイトのメモリが必要です。このデータの前に、画素数や画素当たりのビット数を付記したファイルがBMP型ファイルです。
       しかし、このままでは、ファイルが大きくなりますから、多くの場合、JPEG と呼ばれる方式で圧縮します。JPEGの圧縮の度合いはある程度指定が可能です。JPEG に変換することで平均 1/10 のサイズに圧縮できます。JPEG は写真機を含めた静止画のファイル形式として標準的な存在です。また、画像を編集するソフトでは、画像以外の情報も記録するため、独自の記録形式を採用しています。
    2. 音声の表現

       音声は音の波形の強さを一定時間ごとに記録した数字の列としてディジタル記録します。音の強さを数値に変換することをサンプリングと呼んでいます。音楽CDでは1秒間に44100個の数字に変換します。一つの数字は2バイトで標記します。また、音楽CDの場合左右2チャンネルの音を同時に記録しますから、1秒あたり
       44100*2*2バイト
      の情報量になります。Windows では、この音声データの前に、秒あたりのサンプル数、サンプルあたりのビット数などの情報を付加して記録したファイルを WAV型 ファイルと呼びます。
       このままでは、情報量が大きいので圧縮します。よく利用される圧縮形式は MP3 と呼ばれる方式で、多くの音を扱うプログラムはこの方式を扱うことができます。音声のファイルの形式はMP3以外に、AIFF、AAC、ATRAC、などがあり、特に著作権に関連すると取り扱いが複雑になります。MP3やAACは、人の聴覚に聴き取りにくい部分を圧縮するため、ファイルサイズは小さくなりますが音質は劣化します(非可逆圧縮方式)。一方、元に復元可能な形で圧縮(ロスレス圧縮)されたファイル形式(FLAC、TAC)もあります。
       また、音声編集を行うソフトでは、音声以外の情報を記録するため独自の記録形式をとります。

  4. まとめ、デモ

     
    1. まとめ

      ビット、バイト、が情報量の基本単位
       文字は標準的な文字コードで表現される
       英数字は JIS やASCII で定められている
       漢字は2バイトコードで、統一されていない
       Uni(utf-8) コードが注目されている
    2. デモ

      漢字のコードの見方(WindowsToolBox)
      IMEツールパッド(手書き入力)
  5. 演習、小テスト、課題

    1. 演習

      16進数 25 の2進数を求める。
      16進数 ac3 に対応する2進数を求める
      自分の名前のローマ字を8ビットコードに変換し、16進コードで表記してください。
      文字 愛 と 悪 を プログラムで比較するとどちらが大きいか理由をつけて答えなさい。
      (注 読みの順ではない)
    2. アンケート

      各問に最適な解答を選択し、カードにマークしてください。
      1:16進数A4は
        1:10011000 2:10101000  3:10100100  4:10110011
      2:文字 @a1 は、16進数で表現すると
        1:406131  2:404132  3:649749 4:わからん
      3:BSコードは
        1:改行する 2:暗号化する 3:大文字にする 4:直前の文字を削除する
      4:通常の漢字は utf8では何倍とで表現されるか?
       1:1 2:2  3:3 4:4
    3. 課題(レポート)

      ■演習問題の解答
      ■自分の名前の漢字コードはシフトJIS および utf-8 コードでどのようになるか、調べてください。画面右下タスクバーのIMEを右クリックしIMEパッドから調べることができます(表示メニューを詳細にする)。