[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

评分人数

顶啊 难道是沙发?哈哈

TOP

回复 2楼 的帖子

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

TOP

以前不以为然,自从看了寒夜孤星的代码后才发现它的应用,真是愧疚啊

TOP

  1. @echo off
  2. set "$= !#$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~""
  3. setlocal enabledelayedexpansion
  4. for /l %%i in (0, 1, 94) do (
  5.     set "@%%i=!$:~%%i,1!"
  6. )
  7. for /l %%i in (94, -1, 1) do (
  8.     set /a m = %%i - 1
  9.     for /l %%j in (0, 1, !m!) do (
  10.         set /a n = %%j + 1
  11.         for /l %%k in (!n!, 1, !n!) do (
  12.             if !@%%j! gtr !@%%k! (
  13.                 set "@tmp=!@%%j!"
  14.                 set "@%%j=!@%%k!"
  15.                 set "@%%k=!@tmp!"
  16.             )
  17.         )
  18.     )
  19. )
  20. for /l %%i in (0, 1, 94) do (
  21.     echo;@%%i =^> !@%%i!
  22. )
  23. pause
复制代码
加引号与不加引号的排序是不一样的。
  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
复制代码

TOP

本帖最后由 qixiaobin0715 于 2021-12-1 16:31 编辑

好像应当没有这么复杂,将这95个字符打乱顺序一个一行存入a.txt文件,执行下面代码即可:
  1. sort a.txt
复制代码

TOP

返回列表