标题: [其他] [已解决]批处理如何判断一个字符串中是否含有中文? [打印本页]
作者: yuan_53770 时间: 2010-11-27 23:26 标题: [已解决]批处理如何判断一个字符串中是否含有中文?
批处理如何判断一个字符串中是否含有中文,在网上搜索了下,见了如下代码- @echo off
- set/p str=请输入一个字符:
- echo %str%|findstr "[a-zA-Z0-9]" >nul&&(
- echo 不是中文)||echo 是中文
- 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 编辑 ]
作者: hanyeguxing 时间: 2010-11-28 00:43
一般使用debug或fc命令来处理
例如以 fc 写的简单示例:- @echo off
- set "han=c:\Windows\System32\12&3_4\驱动文件(sys)\wmdve.sys"
- >ye_1.txt echo "%han%"
- for %%a in (ye_1.txt) do >nul fsutil file createnew ye_2.txt %%~za
- 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
- :xing
- del /q ye_*
- if defined gu (echo 含有中文) else echo 不含中文
- pause
复制代码
[ 本帖最后由 hanyeguxing 于 2010-11-28 03:18 编辑 ]
作者: wc726842270 时间: 2010-11-28 02:21 标题: 回复 2楼 的帖子
为什么是gtr "99"呢?难道是DEBUG的结果(跟本不了解,只是一时的好奇)
作者: hanyeguxing 时间: 2010-11-28 03:21
原帖由 wc726842270 于 2010-11-28 02:21 发表
为什么是gtr "99"呢?难道是DEBUG的结果(跟本不了解,只是一时的好奇)
不好意思,打错了,应该是7F。跟debug没有关系,是 ANSI 的编码规则决定的。
通过这个方法,可以统计字符中,中、英文字符的字数:要求 han.txt 文本为 ANSI (GB2312)编码- @echo off&setlocal enabledelayedexpansion&title ANSI 字符分类统计演示_寒夜孤星
- for %%a in (han.txt) do set A=%%~za
- if "%A%"=="" goto:ye
- >nul fsutil file createnew ye.txt %A%
- for /f "skip=1 tokens=3" %%a in ('fc /b /c ye.txt han.txt') do (
- if /i "!gu!" gtr "7D" (
- if /i "!gu!" geq "A1" if /i "!gu!" leq "A9" set/a D+=1
- if /i "!gu!"=="BA" if /i "%%a"=="AE" set/a L+=1
- set/a gu=0,B+=1
- ) else (
- if "%%a" geq "41" if /i "%%a" leq "5A" set/a F+=1
- if "%%a" geq "61" if /i "%%a" leq "7A" set/a G+=1
- if "%%a" geq "30" if "%%a" leq "39" set/a H+=1
- if /i "!gu!"=="0D" if /i "%%a"=="0A" set/a I+=1
- if "%%a"=="22" set/a M+=1
- set gu=%%a
- )
- )
- del /q ye.txt
- :ye
- for %%a in (A B C D E F G H I J K L M) do if not defined %%a set %%a=0
- set/a A-=B+I*2,E=A-B,C=B-D,J=E-F-G-H,K=F+G,"I=(I+1)*^!^!A"
- echo 中文类总计:%B%;汉字:%C%;标点及符号:%D%.
- echo 英文类总计:%E%;字母:%K%;大写:%F%;小写:%G%;数字:%H%;行数:%I%;其它字符:%J%.
- echo 总字数:%A%;汉字"寒":%L%;英文双引号:%M%.
- 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 编辑 ]
作者: canyuexiaolang 时间: 2010-11-28 09:53
请参考这段代码- @echo off
- setlocal enabledelayedexpansion
- set "str=我bat是home好.cn人"
- call :test "%str%"
- echo 提取出的汉字有:%cstr%
- pause>nul
- :test
- set "var=%~1"
- for /l %%i in (0 1 20) do (
- set "var_=!var:~%%i,1!"
- if "!var_!"=="" goto :eof
- if !var_! gtr Z set cstr=!cstr!!var_!
- )
复制代码
原文地址:http://bbs.bathome.net/thread-427-1-1.html
作者: hanyeguxing 时间: 2010-11-28 20:08
用if gtr 去直接比较字符存在一些问题:
1,要从7D处分隔,那么不应使用“z”,而应使用“”(删除符);否则英文管道、大括号、波浪、删除符等都会被划到中文类。
2,if 无法直接比较英文双引号等敏感字符;这与楼主要求能处理特殊字符的要求不符。
3,if 无法正常处理如“〇”等中文字符。
[ 本帖最后由 hanyeguxing 于 2010-11-28 20:09 编辑 ]
作者: yuan_53770 时间: 2010-11-29 23:14
非常感谢 寒夜孤星 的帮助,非常仔细。虽然给的代码还不是很懂,但我可以有依据的查询搜索和学习了。
再次感谢!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |