12.2. ASCII
文字と整数の翻訳方法を見ていきましょう。 英数字等の基本文字に対しては 0から127までの整数を割り当てる ASCII(American Standard Code for Information Interchange、アスキー) 規格が多くの状況で使われています。
文字と変換表 #
ASCIIでは128種類の文字に番号 [0,127] を割り当てます。 並び順を以下の表に示します。この表では、1行に16の文字を並べ上の行ほど若い番号、 同じ行ではから左が若い番号となるよう配置しています。 ブラウザの幅の制限で表の右の方は隠れています。 右側は水平スクロールバーを使って見てください。
r\c | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | SP | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | – | . | / |
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進数) です。
普通の文字は 33文字目 SP
(空白文字)から始まるので、行番号 2 以降 (
\(\small r\ge 2\)
) を掲載しました。
表の r行 c列に文字があるとき 2文字並べた rc が16進数での文字の番号です。
たとえば、
SP
は2行目 (r=2) 0列目 (c=0) にあるので番号は16進で20
10進で
\(2\cdot 16+0= 32 \)
、同様に
A
は16進で41
10進で
\(4\cdot 16+1= 49 \)
、
o
は16進で6F
10進で
\(6\cdot 16+15= 111 \)
です。16進数の読み方は次のページ 12.3. bit列と2進数
で確認します。
文字列 #
文字列を整数列に変換する際は、1文字ずつ独立に変換して並べます。
以下は u-tokyo.ac.jp
という文字列の表現です。当然ですが、同じ文字には同じ数が対応します。
u | - | t | o | k | y | o | . | a | c | . | j | p | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
16進 | 75 | 2D | 74 | 6F | 6B | 79 | 6F | 2E | 61 | 63 | 2E | 6A | 70 |
10進 | 117 | 45 | 116 | 111 | 107 | 121 | 111 | 46 | 97 | 99 | 46 | 106 | 112 |
日本語を含めて使う文字種を増やした場合は、ずっと複雑な規則が必要になります。
特徴 #
ASCIIには以下のような便利な点があります
- 1文字を 1 byte (8bit) 以内で表現できます。文字列の各byte を独立に変換できます。等長符号 と呼びます。
0
から9
、A
からZ
、a
からz
が並んで対応します。
これにより、文字3
の4あとの文字は7
と算術と対応します。A
の2つあとの文字が番号の上でもC
となり直観と一致します。- 同様に大文字小文字の変換を、どの文字でも、番号を 32 ずらすことで行えます。たとえば
b
-B
=x
-X
= 32 です。
文字と番号の対応に ASCIIを採用するか別の方法 (たとえば別の表) を考えるかは、任意性があり、慣習や文化の範疇です。 とはいえ ASCII とそれ以外の方法を使うコンピュータ同士で通信しようとすると、翻訳が必要になりますから、現時点で積極的に他の方法に切り替えるメリットはありません。
ASCIIに収録されている文字は、実用上、文字化けせず安全に使うことができます。これはほぼすべての環境が ASCII 互換のためです。
円マーク¥
がASCIIに含まれないことに注意してください。この記号は文字化けします。 過去の日本では バックスラッシュ\
の番号である5C
を¥
に替えて使っていたことがあります。 そのため Microsoft Windows でのファイルパスの区切り文字が国際的にはバックスラッシュ\
, 日本でのみ円記号になっています。一方 Unicode やヨーロッパで使われるiso-8859-1
では別の番号に¥
記号が割り当てられました。
制御文字 #
番号0から32までは制御文字 (control character) と呼ばれる、特殊な役割を持つ符号です。
通常の文字同様にこれらが定義されているので
キーボードにある BS
, ESC
, TAB
などのキーが押された際に、
どのキーが押されたかを他の文字とまったく同じように ASCII の番号でコンピュータが認識できます。
それらの他にも通信で使われる (いた) 符号が定義されています。
r\c | 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 |
その中で改行を表す符号が複数あることは、注意を払う価値があります。
- CR
- carriage return の略で改行を表す文字の一つです。もともとの意味は「タイプライターの印字装置を行の先頭に戻す」(復帰)です。
- LF
- line feed の略で改行を表す文字の一つです。こちらも元々はタイプライターに由来し、「1 行紙を送る」ことが原義です。
どの文字を改行に用いるかは歴史と文化の側面があり、LF
が Linux, BSD などの UNIX 系 OS、CR
+LF
の2文字がMicrosoft
Windows など、CR
が過去の Mac などで主流でした。
つまり改行については、日本語などでおこりうる「文字化け」同様の不具合がASCIIで定義されていた文字のみを使っていても起こりえます。
DEL
DEL
だけは通常の文字の最後の 7F
に配置されています。
これは7bitを2進数であらわすと 1111111
となり認識しやすいためと言われています。