用語辞典・データ・文字コード

ASCII

ASCIIとは

ASCII(American Standard Code for Information Interchange/アメリカン・スタンダード・コード・フォー・インフォメーション・インターチェンジ/アスキー)は、英数字や制御文字を主に7ビットの番号へ対応付けた基本的な文字コードです。

7ビットで表せる値は0から127までの128通りです。ASCIIはその各位置へ制御文字、空間、記号、0〜9、英大文字、英小文字等を割り当てます。日本語の文字はASCIIに含まれません。

ASCIIは「英語だけのテキストファイル」という曖昧な名前ではなく、128個のコード位置の対応表です。保存時は7ビット値を8ビットバイトの下位側へ入れ、上位ビットを0にする形が広く使われます。

基本コード表は表示文字と表示しない制御を含むASCIIはより大きなUnicode文字設定の内側にそのまま含まれる
色分けした抽象コード表、改行・行頭復帰・タブ・空間・非表示制御の動作、より大きなUnicode全体の内側に同じASCII表が入り、日本語を表す桜・鳥居・山・椀がASCIIの外側にあることを示すピクトグラム図解
図1画像は分類と包含関係の概念図です。厳密なビット数と代表値は下の表で確認します。

7ビットと128個の位置

0–31制御領域

NUL、タブ、行feed、carriage戻り値、エスケープ等の機能を含みます。

32空間

印字される形はありませんが、文字間の空白位置を作るgraphic文字です。

33–47記号

感嘆符、引用符、番号sign等の句読記号を含みます。

48–57十進数字

0から9がコード順に連続し、数値変換でこの性質を利用できます。

65–90 / 97–122英大文字・英小文字

それぞれ英字順に連続しますが、間には記号領域があります。

127DEL

Delete位置で、通常表示する文字ではありません。

代表的なコード位置

種類表記10進16進役割
制御NUL000null制御
制御HT909水平タブ
制御LF100A行feed
制御CR130Dcarriage戻り値
空間SP3220空白
数字04830十進数字の先頭
文字A6541英大文字の先頭
文字a9761英小文字の先頭
制御DEL1277F削除位置

制御文字

制御文字は画面へグリフを描く文字ではなく、通信、機器、テキストレイアウトを制御するためのコードです。現代のアプリケーションでは一部だけを形式制御として使い、他は表示・貼り付け・ログ処理で問題になることがあります。

NULはC言語系で文字列終端として扱われることがあり、ファイル名やAPI入力に混ざると切り詰めや検証差を起こします。ESCやBEL等も端末へそのまま出さずエスケープします。

CRとLF

CR(Carriage Return/キャリッジ・リターン)は行内位置を先頭へ戻す制御、LF(Line Feed/ライン・フィード)は次の行へ進める制御です。歴史的な印刷機動作が名称に残っています。

Unix系テキストは主にLF、WindowsテキストはCR+LFを改行として使います。プロトコルではCRLFを要求する仕様もあります。画面上で一行に見えてもバイト列が違うため、Git 差分や解析器で差になります。

空間とタブ

空間はコード32の一文字で、空白幅一つを表すのが基本です。HTはコード9の制御で、次のタブstopへ進みます。何列進むかは表示環境で変わります。

YAMLの字下げ、プログラムソース、表整形では空間とタブを同じに扱いません。見えない文字を表示して確認します。

数字と数値を分ける

ASCIIの文字0はコード48であり、数値ゼロそのものではありません。テキストの123は三つの文字コードからなる列で、アプリケーションが数値へ解析して初めて数値になります。

同様に16進表示41はASCIIのAを表すバイト値として読めますが、文字列としての「4」「1」とは別です。表示基数とデータ種類を明示します。

8ビットバイトへ格納する

RFC 20は7ビットASCIIを8ビットバイトへ埋め、上位ビットを0にする形を示しています。したがってASCIIバイトは16進で00〜7Fの範囲です。

通信にパリティービットを使った歴史的方式もありますが、現代のファイル・ネットワークで「ASCII」と言うと通常はコード値0〜127をバイトへ入れた表現を指します。

Unicodeとの関係

Unicodeは世界の文字へコード点を割り当てるより大きな文字設定で、先頭128コード点はASCIIと同じ対応です。つまりASCIIテキストはUnicodeの一部分としてそのまま解釈できます。

日本語、emoji、多くの記号は127を超えます。「ASCII以外はすべて全角」という分類ではありません。文字幅とコード点、バイト長さは別です。

UTF-8との関係

UTF-8はUnicodeコード点をバイト列へ符号化する方式です。ASCII範囲は同じ値の1バイトで表すため、ASCIIだけのバイト列は有効なUTF-8でもあります。

ただしUTF-8ファイルに日本語が含まれればマルチバイトになります。アプリケーションがASCIIだけを許可するフィールドと、UTF-8を許可するフィールドを区別します。

「拡張ASCII」という言葉

128〜255へ追加文字を割り当てた8ビットコードページが「拡張 ASCII」と呼ばれることがありますが、単一の共通表ではありません。Windowsコードページ、ISO-8859系列等で同じバイトが別文字になります。

不明なテキストを「拡張ASCII」とだけ記録せず、具体的なエンコーディング名を特定します。誤復号後に保存すると元バイトへ戻せなくなる場合があります。

ASCIIを確認する場面

プロトコルコマンド、HTTPヘッダーの一部、ドメインラベルの基礎、ソースコード、設定、ログ、ファイル形式マーカー等でASCII範囲が使われます。仕様がASCIIを要求する部分へ見た目の似たUnicode文字を入れないようにします。

セキュリティでは制御文字、双方向制御、幅ゼロ文字、同形異字を可視化し、識別子の正規化規則を決めます。

ASCIIは0〜127の7ビットコード表で、制御、空間、記号、数字、英字を含みます。Unicodeの先頭128位置と一致し、UTF-8では同じ値の1バイトになります。

7bit code、8bit byteへの格納、control・graphic character表:RFC 20 / STD 80「ASCII format for Network Interchange」

関連用語