【Delphi】(ASCII) コード表を表示するコマンドを作る

# はじめに

ネットで ASCII コード表を確認するのが面倒になったので、コード表を表示するコマンドを作ろうと思いました。

# どんなの？

ASCII の範囲である `0x00..0x7F` を表示できればいいのですが、それだけだと芸がないので、8bit のいわゆる ANK も表示し、制御コードとキャレット記法も表示する事にします。

## コード

実際のコードです。コンソールアプリケーションとなっています。ちょっと悩みましたが `CodePage` という名前にしました。

```pascal:codepage.dpr
program CodePage;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, Winapi.Windows;

const
  CtrlCode: array [0..32] of string = (
    'NUL', 'SOH', 'STX', 'ETX', 'EOT', 'ENQ', 'ACK', 'BEL',
    'BS ', 'HT ', 'LF ', 'VT ', 'FF ', 'CR ', 'SO ', 'SI ',
    'DLE', 'DC1', 'DC2', 'DC3', 'DC4', 'NAK', 'SYN', 'ETB',
    'CAN', 'EM ', 'SUB', 'ESC', 'FS ', 'GS ', 'RS ', 'US ',
    'DEL'
  );
 FmtStr = '  0x%.2x: %s(^%s)';

var
  CP: Integer;
  S: set of byte;

procedure HLine;
const
  LineChar: array [Boolean] of char = ('+', '-');
begin
  for var i := 0 to 34 do
    Write(LineChar[Odd(i)]);
  Writeln;
end;

procedure PutChar(x, y: byte);
begin
  var b := x * 16 + y;
  if not (b in S) then
    b := $20;
  Write(AnsiChar(b), '|');
end;

begin
  CP := GetConsoleCP();
  Writeln('Active code page: ', CP);
  if CP = 932 then
    S := [$20..$7E, $A1..$DF]
  else
    S := [$20..$7E, $80..$FF];
  HLine;
  Write('| |');
  for var c := 0 to 15 do
    Write(Format('%x|', [c]));
  Writeln;
  HLine;
  for var r := 0 to 15 do
  begin
    Write(Format('|%x|', [r]));
    for var c := 0 to 15 do
      PutChar(c, r);
    var Ctrl := '';
    Ctrl := Ctrl + Format(FmtStr, [r + $00, CtrlCode[r + $00], Chr(r + $40)]);
    Ctrl := Ctrl + Format(FmtStr, [r + $10, CtrlCode[r + $10], Chr(r + $50)]);
    if r = 15 then
      Ctrl := Ctrl + Format(FmtStr, [r + $70, CtrlCode[$20], Chr(r + $30)]);
    Writeln(Ctrl);
  end;
  HLine;
end.
```

### 実行

実行すると次のような表が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/6fdbff8f-300b-26e2-7933-ccec68d2d397.png)


# おわりに
「Delphi 12 Athens 使ってるんなら、これでよくね？」

```pascal:CodePage2.dpr
program CodePage2;

{$APPTYPE CONSOLE}

uses
  Winapi.Windows;

begin
  Writeln('Active code page: ', GetConsoleCP());
  Writeln('''
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | |0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |0| | | |0|@|P|`|p| | | |ｰ|ﾀ|ﾐ| | |  0x00: NUL(^@)  0x10: DLE(^P)
  |1| | |!|1|A|Q|a|q| | |｡|ｱ|ﾁ|ﾑ| | |  0x01: SOH(^A)  0x11: DC1(^Q)
  |2| | |"|2|B|R|b|r| | |｢|ｲ|ﾂ|ﾒ| | |  0x02: STX(^B)  0x12: DC2(^R)
  |3| | |#|3|C|S|c|s| | |｣|ｳ|ﾃ|ﾓ| | |  0x03: ETX(^C)  0x13: DC3(^S)
  |4| | |$|4|D|T|d|t| | |､|ｴ|ﾄ|ﾔ| | |  0x04: EOT(^D)  0x14: DC4(^T)
  |5| | |%|5|E|U|e|u| | |･|ｵ|ﾅ|ﾕ| | |  0x05: ENQ(^E)  0x15: NAK(^U)
  |6| | |&|6|F|V|f|v| | |ｦ|ｶ|ﾆ|ﾖ| | |  0x06: ACK(^F)  0x16: SYN(^V)
  |7| | |'|7|G|W|g|w| | |ｧ|ｷ|ﾇ|ﾗ| | |  0x07: BEL(^G)  0x17: ETB(^W)
  |8| | |(|8|H|X|h|x| | |ｨ|ｸ|ﾈ|ﾘ| | |  0x08: BS (^H)  0x18: CAN(^X)
  |9| | |)|9|I|Y|i|y| | |ｩ|ｹ|ﾉ|ﾙ| | |  0x09: HT (^I)  0x19: EM (^Y)
  |A| | |*|:|J|Z|j|z| | |ｪ|ｺ|ﾊ|ﾚ| | |  0x0A: LF (^J)  0x1A: SUB(^Z)
  |B| | |+|;|K|[|k|{| | |ｫ|ｻ|ﾋ|ﾛ| | |  0x0B: VT (^K)  0x1B: ESC(^[)
  |C| | |,|<|L|\|l||| | |ｬ|ｼ|ﾌ|ﾜ| | |  0x0C: FF (^L)  0x1C: FS (^\)
  |D| | |-|=|M|]|m|}| | |ｭ|ｽ|ﾍ|ﾝ| | |  0x0D: CR (^M)  0x1D: GS (^])
  |E| | |.|>|N|^|n|~| | |ｮ|ｾ|ﾎ|ﾞ| | |  0x0E: SO (^N)  0x1E: RS (^^)
  |F| | |/|?|O|_|o| | | |ｯ|ｿ|ﾏ|ﾟ| | |  0x0F: SI (^O)  0x1F: US (^_)  0x7F: DEL(^?)
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  ''');
end.
```

「SysUtils 使わないから EXE サイズも小さくなるし」

| EXE | ファイルサイズ |
|:---:|---:|
|CodePage.exe| 159,744 bytes|
|CodePage2.exe|60,416 bytes|

ぐぬぬ...

**See also:**

 - [【Delphi】Delphi 12 Athens について](https://qiita.com/ht_deko/items/426d16042d72317d2d64)