計算機で文字を扱う場合、内部では文字に付けた番号を元に管理している。 計算機で利用できる文字には全て番号がついている。この番号のことを 文字コードという。
abcdefg... ABCD..., 0123..., !@#$ () などの、日本語入力OFFのまま入れ られる文字や記号には全てASCIIコード(American Standard Code for Information Interchange)が割り当てられている。
ASCIIコード表を以下に示す。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
1 | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
2 | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | |
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |
この表は16進数での文字コード表記となっている。最左列の縦に並ぶ0-7が
16進数の10の位で、最上行の横に並ぶ0-Fが16進数の1の位である。たとえば、
アルファベットの大文字A
は、「4の行」の「1の列」にあるので、
16進数の「41」が文字コードとなる。以下、16進数の数字を表
すときは、先頭に 0x
を付けて表す。「16進数41」==「0x41」
表中、文字コード 0x00 - 0x1Fは、制御文字といい主に端末を制御 するための文字コードが並んでいる。代表的なものとしては、
などがある。これらの制御文字をキーボードから入力するときは、制御文字
の文字コードに0x40を足した文字を、Ctrlキーを押しながらタイプ
する。つまり、0x09のHT
は、0x40を足した0x49がI
なので、C-i が対応するキーとなる。また、慣習的に 0x00のNULは
C-SPC(Ctrlを押しながらスペース)に対応させることが多い。
まとめると
という風にキー入力できる。ただし、現在ではこれらの制御文字を直接画面 に出すことはほとんどないので、C-英字 などのキー入力にはカーソ ル移動したり、画面を消したりするなどの「機能」が割り当てられていることが 多い。
実際に、これらの制御文字そのものを入力したいときには
C-vを押してから制御文字
C-qを押してから制御文字
をタイプする。ためしに、BEL
コードを使って、端末(Terminal)のベ
ルを鳴らしてみよう。Terminalで次のようにタイプする。
echo "^G" (^Gの部分は C-v C-g とタイプする)
Terminalで順に e c h o スペース " C-v C-g "
とタイプすると、画面に echo "^G"
と出ているはずな
ので、それを確認したら最後に [Return] を押す。
ピッ
と音が出るはずである。ここで利用した echo
というコマンド
は、後続する引数をそのまま出力するものである(シェルの内部コマンド)。
また、0x1B のESC
コードも端末制御をするのによく用いられ
る。ESC
コードに続いて一連の決まった文字を端末に出力すると、
端末の文字の種類を変えたりすることができる。有名なものに、文字色を変える
エスケープシーケンスがある。
ESC [ 30m
→
文字色を黒に
ESC [ 31m
→
文字色を赤に
ESC [ 32m
→
文字色を緑に
ESC [ 33m
→
文字色を黄色に
ESC [ 34m
→
文字色を青に
ESC [ 35m
→
文字色をマジェンタに
ESC [ 36m
→
文字色をシアンに
ESC [ 37m
→
文字色を白に
ESC [ m
→
文字の属性を元に戻す
ためしに、画面に黄色の文字を出してみよう。ESC
コードはシェル上とRubyプログラムでは \e
で表せる。
C-v ESC とタイプしよう。
echo "Hello \e[33mworld"
Hello world
のように色の変わったメッセージが表れる。
他のプログラミング言語と比較すると、Rubyでは文字コードのことを意識し なくてもプログラミングできる範囲が広くなっている。上記のように画面に出す メッセージの色を変えたいようなときは文字コードを意識する必要がある。
ある文字コードのものを画面に出力したい場合は、printf
の
フォーマット文字列のところに %c
を指定する。たとえば、
printf("%c", 0x07)
とすると、文字コード 0x07
つまりBEL
が出力さ
れ、端末のベルが鳴る。やってみよう。
irb irb(main):001:0> printf("%c", 0x07)
文字コードを実際の文字に変換するのが %c
である
ならばその逆は何だろう。ある文字の文字コードを得るには
?
文字.ord
を使う。プログラム中に ?a.ord
と書けば、それは 文字 'a' の文字
コード(つまり0x61)と書いたのと同じことになる。?9.ord
と書けば '9' の文字コード(つまり0x39)と書いたのと同じことになる。
次のプログラムは、ASCIIコード表のうち、'!'
(0x21) -
'z'
(0x7A) の範囲の文字全てを出力するものである。
ascii.rb
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- char = ?!.ord # ! の文字コード(==0x21) while char <= ?Z.ord printf("ascii-code %3d(0x%02x): %c\n", char, char, char) char += 1 end
上記のプログラム ascii.rb
を実際に実行してみること
Rubyプログラム中の文字列は、あたかも文字コードの数値が並んで入ってい る配列のように考えることができる。たとえば、"Hello" という文字 列を考えよう。各文字の文字コードを調べると、Hは0x48、eは0x65、lは0x6c、o は0x6fとなる。これらの数値が並んで配列に入ったものをイメージしよう。
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
H |
e |
l |
l |
o |
0x48 | 0x65 | 0x6c | 0x6c | 0x6f |
文字列 "Hello" の最初の部屋(0号室)を取り出すときは、
配列のときと同様大括弧[ ]
を利用する。
printf("%c\n", "Hello"[0]) ↓ H printf("%x\n", "Hello"[0].ord) (.ordにより文字コードが得られる) ↓ 48 (これは16進数。以下も同じ)
printf("%x\n", "Hello"[1].ord) ↓ 65
(以下同様)
これを文字列の先頭から、末尾まで繰り返すプログラムは以下のようになる。
hellocode.rb
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- hello = "Hello" i = 0 while i < hello.length printf("%c → 0x%x\n", hello[i], hello[i].ord) i += 1 end