在批处理中进行 ASCII 字符串大小比较, 本来想当然的以为其大小依据是 ASCII 字符码值, 可事实并非如此.
以下是一个 ASCII 可见字符(码值从 32 到 126) 共 95 个字符 在批处理字符串比较中的实际次序表, 编号从 00 到 94, 编号越小, 字符也越小.
观察此表, 总体次序 部分性地和 ASCII 次序相符. 有以下的几个特点:
① 所有的 标点符号 在 数字字符 的前面; 所有的 数字字符 在 字母的前面;
② 数字字符中, 按对应数字值大小排序;
③ 字母中, 不同的字母比较, 不论其大小写, 而只以在字母表中的次序排大小;
④ 同一个字母, 小写的小于大写的.
⑤ 成对的 标点符号, 左边的在前, 右边的在后. 即: (小于), [小于], {小于}, <小于>
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:{`}
- 25:{{}
- 26:{|}
- 27:{}}
- 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 个字符次序表的代码(代码中开启了 延迟的环境变量扩展, 简化代码起见, 故将 ! 单独处理)- @echo off & setlocal enabledelayedexpansion & cls
- (set chrs=^"#$%%^&'^(^)*+,-./01234 56789:;^<=^>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdefghijklmnopqrstuvwxyz{^|}~)
- echo 这是一个由 ASCII 码值 32--126 ^(除了半角感叹号外^) 共 94 个字符组成的字符串:
- echo %chrs%
- set /p=按任意键查看对这 94 个字符进行初始编号...<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=按任意键查看对这 94 个字符进行排序后的次序表...<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=按任意键查看插入半角感叹号后, 95 个字符的全次序表...<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
复制代码 关闭延迟的环境变量扩展条件下 确定 半角感叹号 ! 在表中的位置的代码- if ! lss # (echo lll) else echo ggg
复制代码 输出 lll 表明 ! 小于 #- if ! lss - (echo lll) else echo ggg
复制代码 输出 ggg 表明 ! 大于 -
- 和 # 之间只剩下一个双引号 " 感叹号 ! 和双引号 " 的大小关系又如何:- if ^! lss ^" (echo lll) else echo ggg
复制代码 输出 lll- if ^! gtr ^" (echo ggg) else echo lll
复制代码 输出 lll- if ^! equ ^" (echo ==) else echo ≠
复制代码 输出 ≠
以上表明 感叹号 ! 是小于双引号 " 的, 所以感叹号在表中的编号应是 03, 而双引号及后面的所有字符编号全部加1. |