[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

在批处理中进行 ASCII 字符串大小比较, 本来想当然的以为其大小依据是 ASCII 字符码值, 可事实并非如此.
以下是一个 ASCII 可见字符(码值从 32 到 126) 共 95 个字符 在批处理字符串比较中的实际次序表, 编号从 00 到 94, 编号越小, 字符也越小.
观察此表, 总体次序 部分性地和 ASCII 次序相符. 有以下的几个特点:
① 所有的 标点符号 在 数字字符 的前面; 所有的 数字字符 在 字母的前面;
② 数字字符中, 按对应数字值大小排序;
③ 字母中, 不同的字母比较, 不论其大小写, 而只以在字母表中的次序排大小;
④ 同一个字母, 小写的小于大写的.
⑤ 成对的 标点符号, 左边的在前, 右边的在后. 即: (小于), [小于], {小于}, <小于>
ASCII 可见字符(码值从 32 到 126)批处理比较实际次序表
  1. 00:{ }
  2. 01:{'}
  3. 02:{-}
  4. 03:{!}
  5. 04:{"}
  6. 05:{#}
  7. 06:{$}
  8. 07:{%}
  9. 08:{&}
  10. 09:{(}
  11. 10:{)}
  12. 11:{*}
  13. 12:{,}
  14. 13:{.}
  15. 14:{/}
  16. 15:{:}
  17. 16:{;}
  18. 17:{?}
  19. 18:{@}
  20. 19:{[}
  21. 20:{\}
  22. 21:{]}
  23. 22:{^}
  24. 23:{_}
  25. 24:{`}
  26. 25:{{}
  27. 26:{|}
  28. 27:{}}
  29. 28:{~}
  30. 29:{+}
  31. 30:{<}
  32. 31:{=}
  33. 32:{>}
  34. 33:{0}
  35. 34:{1}
  36. 35:{2}
  37. 36:{3}
  38. 37:{4}
  39. 38:{5}
  40. 39:{6}
  41. 40:{7}
  42. 41:{8}
  43. 42:{9}
  44. 43:{a}
  45. 44:{A}
  46. 45:{b}
  47. 46:{B}
  48. 47:{c}
  49. 48:{C}
  50. 49:{d}
  51. 50:{D}
  52. 51:{e}
  53. 52:{E}
  54. 53:{f}
  55. 54:{F}
  56. 55:{g}
  57. 56:{G}
  58. 57:{h}
  59. 58:{H}
  60. 59:{i}
  61. 60:{I}
  62. 61:{j}
  63. 62:{J}
  64. 63:{k}
  65. 64:{K}
  66. 65:{l}
  67. 66:{L}
  68. 67:{m}
  69. 68:{M}
  70. 69:{n}
  71. 70:{N}
  72. 71:{o}
  73. 72:{O}
  74. 73:{p}
  75. 74:{P}
  76. 75:{q}
  77. 76:{Q}
  78. 77:{r}
  79. 78:{R}
  80. 79:{s}
  81. 80:{S}
  82. 81:{t}
  83. 82:{T}
  84. 83:{u}
  85. 84:{U}
  86. 85:{v}
  87. 86:{V}
  88. 87:{w}
  89. 88:{W}
  90. 89:{x}
  91. 90:{X}
  92. 91:{y}
  93. 92:{Y}
  94. 93:{z}
  95. 94:{Z}
复制代码
以下是生成此表的代码, 首先生成不包含 半角感叹号 ! 的 94 个字符的次序表, 然后根据几个简单比较得出 半角感叹号 在表中的位置.
表生成代码中, 字符排序采用选择排序法. 字符串初始化中, 对特殊字符进行了转义:
用前导上角号 ^ 转义的有 8 个特殊字符: "&()<>^|
另外 百分号 % 用自身双写进行转义.

生成除 半角感叹号 ! 外 94 个字符次序表的代码(代码中开启了 延迟的环境变量扩展, 简化代码起见, 故将 ! 单独处理)
  1. @echo off & setlocal enabledelayedexpansion & cls
  2. (set chrs=^"#$%%^&'^(^)*+,-./01234 56789:;^<=^>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^_`abcdefghijklmnopqrstuvwxyz{^|}~)
  3. echo 这是一个由 ASCII 码值 32--126 ^(除了半角感叹号外^) 共 94 个字符组成的字符串:
  4. echo %chrs%
  5. set /p=按任意键查看对这 94 个字符进行初始编号...<nul&pause>nul&echo.
  6. for /l %%i in (0,1,93) do (
  7.   (set cc%%i=!chrs:~%%i,1!)
  8.   set /a "ii=100+%%i"
  9.   echo !ii:~1!:{!cc%%i!}
  10. )
  11. set /p=按任意键查看对这 94 个字符进行排序后的次序表...<nul&pause>nul&echo.
  12. for /l %%i in (0,1,92) do (
  13.   set /a "min=%%i, n=%%i+1"
  14.   (set minChr=!cc%%i!)
  15.   for /l %%j in (!n!,1,93) do (
  16.     if "!cc%%j!" lss "!minChr!" (
  17.   (set min=%%j)
  18.   (set minChr=!cc%%j!)
  19. )
  20.   )
  21.   for /f "tokens=1" %%m in ("!min!") do (
  22.     (set tt=!cc%%i!)
  23. (set cc%%i=!cc%%m!)
  24. (set cc%%m=!tt!)
  25.   )
  26. )
  27. for /l %%i in (0,1,93) do (
  28.   set /a "ii=100+%%i"
  29.   echo !ii:~1!:{!cc%%i!}
  30. )
  31. set /p=按任意键查看插入半角感叹号后, 95 个字符的全次序表...<nul&pause>nul&echo.
  32. for /l %%i in (93,-1,3) do (
  33.   set /a "jj=%%i+1"
  34.   for /f "tokens=1" %%j in ("!jj!") do (set cc%%j=!cc%%i!)
  35. )
  36. setlocal disabledelayedexpansion
  37. (set cc3=!)
  38. setlocal enabledelayedexpansion
  39. for /l %%i in (0,1,94) do (
  40.   set /a "ii=100+%%i"
  41.   echo !ii:~1!:{!cc%%i!}
  42. )
  43. pause
  44. exit /b
复制代码
关闭延迟的环境变量扩展条件下 确定 半角感叹号 ! 在表中的位置的代码
  1. if ! lss # (echo lll) else echo ggg
复制代码
输出 lll 表明 ! 小于 #
  1. if ! lss - (echo lll) else echo ggg
复制代码
输出 ggg 表明 ! 大于 -
- 和 # 之间只剩下一个双引号 "  感叹号 ! 和双引号 " 的大小关系又如何:
  1. if ^! lss ^" (echo lll) else echo ggg
复制代码
输出 lll
  1. if ^! gtr ^" (echo ggg) else echo lll
复制代码
输出 lll
  1. if ^! equ ^" (echo ==) else echo ≠
复制代码
输出 ≠
以上表明 感叹号 ! 是小于双引号 " 的, 所以感叹号在表中的编号应是 03, 而双引号及后面的所有字符编号全部加1.
1

评分人数

回复 2楼 的帖子

总算有人回复了, 感激~~

TOP

返回列表