it编程 > 前端脚本 > Dos/bat

批处理ASCII字符比较大小实际次序表

167人参与 2024-05-19 Dos/bat

在批处理中进行 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.

到此这篇关于批处理ascii字符比较大小实际次序表的文章就介绍到这了,更多相关ascii字符比较大小内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

批处理cmd之桌面快捷方式创建工具

05-19

批处理统计词频实现代码(统计重复行的数量/每行重复出现的次数)

05-19

windows设置开机自动运行批处理的方法

05-19

批处理bat将txt文本第一列内容相同的行的最后一列的数字相加

05-19

浅谈如何在bat文件中调用另一个bat文件

05-19

批处理bat将文本中的数据相加输出的代码

05-19

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论