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

[其他] [已解决]批处理如何判断一个字符串中是否含有中文?

批处理如何判断一个字符串中是否含有中文,在网上搜索了下,见了如下代码
  1. @echo off
  2. set/p str=请输入一个字符:
  3. echo %str%|findstr "[a-zA-Z0-9]" >nul&&(
  4. echo 不是中文)||echo 是中文
  5. pause
复制代码
但它只能过滤掉大小写的英文字母和数字,如果你输入一个常用标点符号如括号,它也会判断为中文,
假设一个字符串中含有英文字母(大小写)、数字(正和负数)、(特殊)符号、中文(简繁体),如何用一个批处理来判断这个字符串中含有中文?

网上有这么一个思路:就是取占的字节数来判断。一般来说,一个英文或数字都只占一个字节,而一个汉字占两个字节,但并非点两个字节的都是汉字。这个思路搜索自一个JavaEye的技术网站,乱搜索到的,我对J不懂,但我想批处理应该也能用这个思路进行判断吧
--------------------------------------------------------------------------------------------------------------------------------------------
String.getBytes().length != String.length()
String.getBytes().length取的是字节数,因为中文是全角字符,所以每个中文的字节数都为2
String.length()取的是字符长度,按中文的个数来截取。
但是这样有bug  因为中文是全角字符没错,但是并非全角字符就全部是中文
另外的解决方法如下:
  String   str   =   "中国chinese";   
  for(int   i   =0   ;i   <   str.length()   ;   i   ++)   
  {   
  System.out.println(str.substring(i,   i+1).matches("[\\u4e00-\\u9fa5]+"));   
  }   
这是取的中文在Unicode中的编码区间,而且将字符中的每一个substring都拿出来与字符区间相比
最终很容易判断出字符中是否有中文。
---------------------------------------------------------------------------------------------------------------------------------------------
比如一个路径
c:\Windows\System32\12&3_4\驱动文件(sys)\wmdve.sys
上面的字符串用批处理如何判断它含有中文??

[ 本帖最后由 yuan_53770 于 2010-11-29 23:14 编辑 ]
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

一般使用debug或fc命令来处理
例如以 fc 写的简单示例:
  1. @echo off
  2. set "han=c:\Windows\System32\12&3_4\驱动文件(sys)\wmdve.sys"
  3. >ye_1.txt echo "%han%"
  4. for %%a in (ye_1.txt) do >nul fsutil file createnew ye_2.txt %%~za
  5. for /f "skip=1 tokens=3" %%a in ('fc /b /c ye_2.txt ye_1.txt') do if /i "%%a" gtr "7F" set gu==&goto:xing
  6. :xing
  7. del /q ye_*
  8. if defined gu (echo 含有中文) else echo 不含中文
  9. pause
复制代码

[ 本帖最后由 hanyeguxing 于 2010-11-28 03:18 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 2楼 的帖子

为什么是gtr "99"呢?难道是DEBUG的结果(跟本不了解,只是一时的好奇)

TOP

原帖由 wc726842270 于 2010-11-28 02:21 发表
为什么是gtr "99"呢?难道是DEBUG的结果(跟本不了解,只是一时的好奇)

不好意思,打错了,应该是7F。跟debug没有关系,是 ANSI 的编码规则决定的。
通过这个方法,可以统计字符中,中、英文字符的字数:要求 han.txt 文本为 ANSI (GB2312)编码
  1. @echo off&setlocal enabledelayedexpansion&title ANSI 字符分类统计演示_寒夜孤星
  2. for %%a in (han.txt) do set A=%%~za
  3. if "%A%"=="" goto:ye
  4. >nul fsutil file createnew ye.txt %A%
  5. for /f "skip=1 tokens=3" %%a in ('fc /b /c ye.txt han.txt') do (
  6.           if /i "!gu!" gtr "7D" (
  7.                     if /i "!gu!" geq "A1" if /i "!gu!" leq "A9" set/a D+=1
  8.                     if /i "!gu!"=="BA" if /i "%%a"=="AE" set/a L+=1
  9.                     set/a gu=0,B+=1
  10.                     ) else (
  11.                     if "%%a" geq "41" if /i "%%a" leq "5A" set/a F+=1
  12.                     if "%%a" geq "61" if /i "%%a" leq "7A" set/a G+=1
  13.                     if "%%a" geq "30" if "%%a" leq "39" set/a H+=1
  14.                     if /i "!gu!"=="0D" if /i "%%a"=="0A" set/a I+=1
  15.                     if "%%a"=="22" set/a M+=1
  16.                     set gu=%%a
  17.                     )
  18.           )
  19. del /q ye.txt
  20. :ye
  21. for %%a in (A B C D E F G H I J K L M) do if not defined %%a set %%a=0
  22. set/a A-=B+I*2,E=A-B,C=B-D,J=E-F-G-H,K=F+G,"I=(I+1)*^!^!A"
  23. echo 中文类总计:%B%;汉字:%C%;标点及符号:%D%.
  24. echo 英文类总计:%E%;字母:%K%;大写:%F%;小写:%G%;数字:%H%;行数:%I%;其它字符:%J%.
  25. echo 总字数:%A%;汉字"寒":%L%;英文双引号:%M%.
  26. pause>nul
复制代码
注意:
fc和debug命令能处理的文件大小都是有限制的。由于采用逐字节解析以及fc命令本身的问题,效率很低。
if /i "!gu!"=="BA" if /i "%%a"=="AE" set/a L+=1 是用来统计汉字“寒(BA AE)”出现的次数,可以不要
if /i "%%a"=="22" set/a M+=1 是用来统计英文双引号“"(22)”出现的次数,可以不要
其他的if语句可以根据需要选择
set/a "I=(I+1)*^!^!A" 对变量 I 进行加1运算,如果A为0,则强制 I 也为0
set/a A-=B+I*2 就是 set/a A=A-B-I*2 。
行数统计由 (0D 0A) 计算完成,所以包含空行。

将代码直接复制到文本han.txt中测试,耗时0.15秒
输出结果:
中文类总计:55;汉字:55;标点及符号:0.
英文类总计:1058;字母:388;大写:72;小写:316;数字:31;行数:27;其它字符:639.
总字数:1113;汉字"寒":2;英文双引号:66.

[ 本帖最后由 hanyeguxing 于 2010-11-28 08:12 编辑 ]
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

请参考这段代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "str=我bat是home好.cn人"
  4. call :test "%str%"
  5. echo 提取出的汉字有:%cstr%
  6. pause>nul
  7. :test
  8. set "var=%~1"
  9. for /l %%i in (0 1 20) do (
  10.    set "var_=!var:~%%i,1!"
  11.    if "!var_!"=="" goto :eof
  12.    if !var_! gtr Z set cstr=!cstr!!var_!
  13. )
复制代码
原文地址:http://bbs.bathome.net/thread-427-1-1.html

TOP

用if gtr 去直接比较字符存在一些问题:
1,要从7D处分隔,那么不应使用“z”,而应使用“”(删除符);否则英文管道、大括号、波浪、删除符等都会被划到中文类。
2,if 无法直接比较英文双引号等敏感字符;这与楼主要求能处理特殊字符的要求不符。
3,if 无法正常处理如“〇”等中文字符。

[ 本帖最后由 hanyeguxing 于 2010-11-28 20:09 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

非常感谢 寒夜孤星 的帮助,非常仔细。虽然给的代码还不是很懂,但我可以有依据的查询搜索和学习了。

再次感谢!

TOP

返回列表