标题: ASCII 字符批处理比较大小实际次序表 [打印本页]
作者: neorobin 时间: 2009-12-23 18:21 标题: ASCII 字符批处理比较大小实际次序表
在批处理中进行 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.
作者: lyqq1982 时间: 2009-12-23 22:24
顶啊 难道是沙发?哈哈
作者: neorobin 时间: 2009-12-23 22:54 标题: 回复 2楼 的帖子
总算有人回复了, 感激~~
作者: wc726842270 时间: 2010-12-26 02:54
以前不以为然,自从看了寒夜孤星的代码后才发现它的应用,真是愧疚啊
作者: Demon 时间: 2012-8-14 12:03
- @echo off
- set "$= !#$%%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~""
- setlocal enabledelayedexpansion
- for /l %%i in (0, 1, 94) do (
- set "@%%i=!$:~%%i,1!"
- )
- for /l %%i in (94, -1, 1) do (
- set /a m = %%i - 1
- for /l %%j in (0, 1, !m!) do (
- set /a n = %%j + 1
- for /l %%k in (!n!, 1, !n!) do (
- if !@%%j! gtr !@%%k! (
- set "@tmp=!@%%j!"
- set "@%%j=!@%%k!"
- set "@%%k=!@tmp!"
- )
- )
- )
- )
- for /l %%i in (0, 1, 94) do (
- echo;@%%i =^> !@%%i!
- )
- pause
复制代码
加引号与不加引号的排序是不一样的。- 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
复制代码
作者: qixiaobin0715 时间: 2021-12-1 16:21
本帖最后由 qixiaobin0715 于 2021-12-1 16:31 编辑
好像应当没有这么复杂,将这95个字符打乱顺序一个一行存入a.txt文件,执行下面代码即可:复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |