Board logo

标题: [其他] [讨论]批处理if命令是怎样来判别汉字字符的 [打印本页]

作者: batman    时间: 2008-7-27 13:28     标题: [讨论]批处理if命令是怎样来判别汉字字符的


在批处理中我们经常要对字符进行判断,判断字符是数字还是字母还是汉字还是特殊字符而对数字
和字母的判断,我们可以使用findstr+管道来进行:
  1. echo %a%|findstr "[^0-9]">nul||echo %a%是数字
  2. echo %a%|findstr /i "[^a-z]">nul||echo %a%是字母
复制代码
如是对单个字符进行判断,我们可以用for+if来进行:
  1. for %%i in (a b c d e f g h i j k l n m o p q r s t u v w x y z) do if /i "%%i" equ "%a%" echo %a%是字母
  2. for %%i in (0 1 2 3 4 5 6 7 8 9) do if "%%i" equ "%a%" echo %a%是数字
复制代码
而对%、!、#、<、>、*等特殊字符的判断,则牵涉到批处理中对特殊字符的处理,由于情况复杂,
我们就姑且不在这里谈论了,如大家有兴趣,可以到高手挑战区的那道文件重命名贴跟贴讨论。
那么对汉字的判断如何进行呢?个人喜欢用如下代码:
  1. if /i "%a%" gtr "z" echo %a%是汉字
复制代码
因为我认为在if /i "%a%" gtr "z"语式中,if是把%a%和z都当做unicode字符来比较,如下:
  1. if "5" gtr "12" (echo 5^>12) else (echo 5^<12)
复制代码
大家是不是想结果是5<12,其实结果是5>12,为什么呢,因为当比较的双方都加上双引号后,if将
会对比较的双方进行逐字符比较,首先比较第一个字符,如相同则比较第二个字符,如相同再比较
第三个字符,以此类推一直到比较出大小或者到最后一个字符输出比较结果,而5和12第一个字符分
别是5和1,而5>1,所以便有了以上的5>12的结果。那么我们讨论的问题就出现了:

问题一 if /i "a" gtr "b" 是不是就是把a和b当做unicode字符来比较?
问题二 如以上的答案是“是”,那么if /i "%a%" gtr "z"是不是就能判定%a%是汉字呢?



作者: asdisk    时间: 2008-7-27 14:27     标题: 批处理中倒计时的代码。

最近写一个程序,突然要用到用批处理实现一个限定任务倒计时的代码(限定在规定时间内手工完成限定的操作)。。说是的还不怎么会,还望有人点拨一下。谢了。。写完了批处理送你一份。^_^
作者: youxi01    时间: 2008-7-27 17:21

呵呵,建议楼上的重新开一个询问帖子

要实现楼上的功能,纯批处理似乎做不到,因为这里相当于要实现两个进程:
1、等待用户响应
2、计时功能
作者: pusofalse    时间: 2008-7-27 18:41

不一定,看cn-dos plp626兄的帖子。
字符从小到大,最小的是' ,而不是空格。
  1. '
  2. -
  3.   
  4.    
  5. !
  6. "
  7. #
  8. $
  9. %
  10. &
  11. (
  12. )
  13. *
  14. *
  15. ,
  16. .
  17. /
  18. :
  19. ;
  20. ?
  21. @
  22. [
  23. \
  24. ]
  25. ^
  26. _
  27. __
  28. ___
  29. `
  30. {
  31. |
  32. }
  33. ~
  34. ˇ
  35. ︿
  36. +
  37. <
  38. =
  39. >
  40. ±
  41. ×
  42. ÷
  43. ◎︴
  44. ¤
  45. §
  46. °
  47. ·
  48. ……
  49. 0
  50. 1
  51. 2
  52. 3
  53. 4
  54. 5
  55. 6
  56. 7
  57. 8
  58. 9
  59. A
  60. a
  61. B
  62. b
  63. C
  64. c
  65. d
  66. D
  67. e
  68. E
  69. f
  70. F
  71. g
  72. G
  73. H
  74. h
  75. I
  76. i
  77. j
  78. J
  79. k
  80. K
  81. l
  82. L
  83. M
  84. m
  85. n
  86. N
  87. O
  88. o
  89. P
  90. p
  91. q
  92. Q
  93. r
  94. R
  95. s
  96. S
  97. T
  98. t
  99. U
  100. u
  101. V
  102. v
  103. W
  104. w
  105. x
  106. X
  107. y
  108. Y
  109. Z
  110. z
  111. Α
  112. Β
  113. Γ
  114. Δ
  115. Ε
  116. Ζ
  117. Η
  118. Θ
  119. Ι
  120. Κ
  121. Λ
  122. Μ
  123. Ν
  124. Ξ
  125. Ο
  126. Π
  127. Ρ
  128. Σ
  129. Τ
  130. Υ
  131. Φ
  132. Χ
  133. Ψ
  134. Ω
复制代码

http://www.cn-dos.net/forum/viewthread.php?tid=39854&fpage=1&highlight=%E5%AD%97%E7%AC%A6%E9%A1%BA%E5%BA%8F
作者: Batcher    时间: 2008-7-27 22:00

判断字符大于z后,继续判断,因为双字节的标点也算在英文字符内的。
可以通过以前 lxmxn 教给我们的一个方法:
读取一个字符后,
echo %x%>a.txt
然后读取 a.txt 的文件大小是一个字节还是两个字节来判断是不是汉字。
作者: batman    时间: 2008-7-28 08:48

原帖由 Batcher 于 2008-7-27 22:00 发表
判断字符大于z后,继续判断,因为双字节的标点也算在英文字符内的。
可以通过以前 lxmxn 教给我们的一个方法:
读取一个字符后,
echo %x%>a.txt
然后读取 a.txt 的文件大小是一个字节还是两个字节来判断是不是汉 ...

    双字节的标点怎么会属于英文字符?我认为这就是汉字字符了,也就是汉字的
范畴,为什么呢?理由如下:
    因为我们之所以要对字符进行判断是否为汉字,主要是因为在文本处理中往往
要判断一个字符是单字节还是双字节,然后采取相应的操作,如对齐排版。
    那么这是不是就说明我们要讨论的第二个问题:if "%a%" gtr "z" 就一定能判定
%a%是汉字的这个命题是成立的?这个还有待进一步验证了。

[ 本帖最后由 batman 于 2008-7-28 09:01 编辑 ]
作者: batman    时间: 2008-7-28 09:05

原帖由 pusofalse 于 2008-7-27 18:41 发表
不一定,看cn-dos plp626兄的帖子。
字符从小到大,最小的是' ,而不是空格。

'
-

  
   
!

"
#
$
[ ...

这篇plp626发在cn-dos中的帖子我也看过,但却不能说明if比较是把字符当作ASCII字符还是unicode字符来比较的。
作者: pusofalse    时间: 2008-7-28 18:11

我昨天已经测试过了,if比较非ascii码大小比较,dir的/on参数也不是按照ASCII来排列的
作者: batman    时间: 2008-7-29 08:22

原帖由 pusofalse 于 2008-7-28 18:11 发表
我昨天已经测试过了,if比较非ascii码大小比较,dir的/on参数也不是按照ASCII来排列的

请兄弟明示测试的方法和经过。
作者: Batcher    时间: 2008-7-29 13:18

原帖由 pusofalse 于 2008-7-28 18:11 发表
我昨天已经测试过了,if比较非ascii码大小比较,dir的/on参数也不是按照ASCII来排列的

测试的时候,if里面比较的变量加双引号了没有?
作者: pusofalse    时间: 2008-7-29 17:25

原帖由 batman 于 2008-7-29 08:22 发表

请兄弟明示测试的方法和经过。


fc获取文件的十六进制形式asscii码 然后转10进制。
作者: pusofalse    时间: 2008-7-29 17:26

原帖由 Batcher 于 2008-7-29 13:18 发表

测试的时候,if里面比较的变量加双引号了没有?

数字没加 别的字串加了。
作者: batman    时间: 2008-8-2 18:25

&&通过网上查询ascii字符码和unicode字符码,得知用if /i "%a%" gtr "z" 所判断出的字符
不一定是汉字字符,但我们在平常仍可用此方法来判别汉字字符,因为在"z"和汉字间的字符
并不是常见字符;至于if 语式加双引号后是将比较的字符当成什么字符来比较暂时仍未得出结
论,继续探索中。。。

[ 本帖最后由 batman 于 2008-8-2 19:08 编辑 ]
作者: 基拉freedom    时间: 2008-8-17 17:03

不是根据ASCII码吗???
作者: qq641255849    时间: 2008-9-6 21:38

  1. if /i "%a%" geq "幺" ( echo %a%是汉字&pause ) else  ( echo 不是汉字&pause )
复制代码
可以试试这个
作者: flyinspace    时间: 2008-9-7 22:25

if %a% grt z
只是证明%a%是双字节..并没有去判断是否汉字的。

我是用这个来画表格的.
作者: amwfjhh    时间: 2014-11-8 10:41

呵呵,建议楼上的重新开一个询问帖子

要实现楼上的功能,纯批处理似乎做不到,因为这里相当于要实现两个 ...
youxi01 发表于 2008-7-27 17:21



    其实是可以实现的
作者: LJY4.0    时间: 2022-6-12 13:15

回复 1# batman
原来如此
作者: hzlbzo    时间: 2024-3-20 17:01

新手学习中..........




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2