1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT(ドス・バット

一括ASCII文字比較サイズ実数表

2022-01-01 20:18:45

バッチ処理でASCII文字列のサイズを比較する場合、ASCII文字コード値でサイズを比較すると思われますが、そうではありません。

ここでは、文字列の一括比較において、実際にASCIIの可視文字(コード値32~126)の95文字を00~94までの番号で、番号が小さいほど小さな文字になるように並べた表を示します。

この表を見ると、全体の順番は部分的にASCIIの順番と一致しています。いくつかの特徴があります。

1) すべての句読点は数字文字の前にあり、すべての数字文字は文字の前にある。
数値のうち、対応する数値の大きさでソートする。
アルファベットの場合、異なる文字は大文字小文字に関係なく、アルファベット順で比較します。
④ 同じ文字で、小文字が大文字より小さいこと。
句読点のペアで、左が先、右が後とする。ということです。(未満)、[未満]、{未満}、<未満>

ASCII可視文字(コード値32~126)一括比較実測順序表

<ブロッククオート

00:{ }
01:{ '}
02:{-}
03:{!}
04:{"}のように
05:{#}
06:{$}
07:{%}
08:{&}。
09:{(}
10:{)}
11:{*}
12:{,}
13:{.}
14:{/}
15:{:}
16:{;}
17:{?}
18:{@}
19:{[}
20:{\}
21:{]}
22:{^}
23:{_}
24:{`}

26:{|}

28:{~}
29:{+}
30:{<}。
31:{=}
32:{>}。
33:{0}
34:{1}
35:{2}
36:{3}
37:{4}
38:{5}
39:{6}
40:{7}
41:{8}
42:{9}
43:{a}
44:{A}
45:{b}
46:{B}
47:{c}
48:{C}
49:{d}
50:{D}
51:{e}
52:{E}
53:{f}
54:{F}
55:{g}
56:{G}
57:{h}
58:{H}
59:{i}
60:{I}
61:{j}
62:{J}
63:{k}
64:{K}
65:{l}
66:{L}
67:{m}
68:{M}
69:{n}
70:{N}
71:{o}
72:{O}
73:{p}
74:{P}
75:{q}
76:{Q}
77:{r}
78:{R}
79:{s}
80:{S}
81:{t}
82:{T}
83:{u}
84:{U}
85:{v}
86:{V}
87:{w}
88:{W}
89:{x}
90:{X}
91:{y}
92:{Y}
93:{z}
94:{Z}

この表を生成するコードを以下に示します。まず、セミコロン感嘆符!を含まない94文字の表を生成し、いくつかの簡単な比較に基づいて、表中のセミ感嘆符の位置を導出します。
表生成のコードでは、選択ソート方式で文字をソートしている。文字列は、特殊文字をエスケープして初期化されます。
先頭のアッパーコロン^でエスケープされる特殊文字は8個です。

"&()<>^|



また、パーセンテージ % は独自のダブルケースでエスケープされます。

94文字のシーケンスに加え、半感嘆符「!」を除いたコードを生成(コードを簡略化するために遅延環境変数の拡張をONにしているので「!」は別扱いになっています)

@echo off & setlocal enabledelayedexpansion & cls
(set chrs=^"#$%%^&'^(^)*+,-. /01234 56789:;^<=^>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdefghijklmnopqrstuvwxyz{^|}~)
echo This is a string consisting of ASCII code values 32--126 ^ (except for the half-exclamation mark ^) with 94 characters:
echo %chrs%
set /p=Press any key to see the initial numbering of these 94 characters... <nul&pause>nul&echo.
for /l %%i in (0,1,93) do (
  (set cc%%i=!chrs:~%%i,1!)
  set /a "ii=100+%%i"
  echo !ii:~1!:{!cc%%i!}
)
set /p=Press any key to see the sorted list of these 94 characters... <nul&pause>nul&echo.
for /l %%i in (0,1,92) do (
  set /a "min=%%i, n=%%i+1"
  (set minChr=!cc%%%i!)
  for /l %%j in (!n!,1,93) do (
    if "!cc%%%j!" lss "!minChr!" (
	  (set min=%%j)
	  (set minChr=!cc%%%j!)
	 )
  )
  for /f "tokens=1" %%m in ("!min!") do (
    (set tt=!cc%%%i!)
	(set cc%%i=!cc%%%m!)
	(set cc%%m=!tt!)
  )
)
for /l %%i in (0,1,93) do (
  set /a "ii=100+%%i"
  echo !ii:~1!:{!cc%%%i!}
)
set /p=Press any key to see the full sequence of 95 characters after inserting the half-exclamation mark... <nul&pause>nul&echo.
for /l %%i in (93,-1,3) do (
  set /a "jj=%%i+1"
  for /f "tokens=1" %%j in ("!jj!") do (set cc%%j=!cc%%%i!)
)
setlocal disabledelayedexpansion
(set cc3=!)
setlocal enabledelayedexpansion
for /l %%i in (0,1,94) do (
  set /a "ii=100+%%i"
  echo !ii:~1!:{!cc%%i!}
)
pause
exit /b

半角の感嘆符を決定する遅延環境変数の拡張条件をOFFにする ! 表中の位置を表すコード

if ! lss # (echo lll) else echo ggg

出力された lll は、! が # よりも小さいことを示します。

if ! lss - (echo lll) else echo ggg

出力されたgggは、! が - よりも大きいことを示します。
- と!の間に二重引用符の"感嘆符が1つだけ残っており、大きさの関係はどうなっているのでしょうか。

if ^! lss ^" (echo lll) else echo ggg

lllを出力する

if ^! gtr ^" (echo ggg) else echo lll

出力 lll

if ^! equ ^" (echo ==) else echo ≠.

出力≠ナす。

上記を見ると、感嘆符「!」はダブルクオート「"」より小さいので、表中の感嘆符は03番、ダブルクオート以下はプラス1番とする必要があることがわかります。

ASCII文字比較表の実際の並び順については、今回で終了です。ASCII文字比較の詳細については、スクリプトハウスの過去記事を検索するか、以下の記事を引き続き閲覧してください。