Board logo

标题: [其他] 批处理if命令为何不能正常处理〇这个字符? [打印本页]

作者: hanyeguxing    时间: 2010-4-6 15:59     标题: 批处理if命令为何不能正常处理〇这个字符?

  1. @echo off
  2. if "〇"=="" (echo 〇为空)else echo 〇不为空
  3. rem 显示〇为空
  4. if "12〇34"=="1234" (echo 相同)else echo 不同
  5. rem 显示相同
  6. if 12〇34==1234 (echo 相同)else echo 不同
  7. rem 显示相同
  8. pause
复制代码

作者: yangfengoo    时间: 2010-4-6 16:16

那里不正常?

没发现
作者: namejm    时间: 2010-4-6 16:20

  这个问题很有意思,貌似 〇 在这里被当做空值来处理了,迷惑中。

  不过,你的代码有点小问题,else和后括号连在一起了,只是对结果没什么影响。
作者: hanyeguxing    时间: 2010-4-6 16:38

原帖由 namejm 于 2010-4-6 16:20 发表
  这个问题很有意思,貌似 〇 在这里被当做空值来处理了,迷惑中。

  不过,你的代码有点小问题,else和后括号连在一起了,只是对结果没什么影响。


俺以前也是好孩子,按着语法中规中矩的写。。。只是后来跟某些人学坏了,能少打一个字符就少打一个字符,连空格都不放过,嘿嘿。

在写一个批处理,其中一个变量的值的字符串中含有〇这个字符,我就计算不明白这个变量的值有多少个字符了。怎么弄结果都不对。后来才发现是〇这个字符引起的。
作者: yangfengoo    时间: 2010-4-6 19:43

Vista 测试完全正常,结果与楼主刚好相反
作者: GNU    时间: 2010-4-6 20:17

Microsoft Windows [Version 6.0.6001]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

C:\Test>if "〇"=="" (echo 〇为空)else echo 〇不为空
〇不为空

C:\Test>if "12〇34"=="1234" (echo 相同)else echo 不同
不同

C:\Test>if 12〇34==1234 (echo 相同)else echo 不同
不同

作者: hanyeguxing    时间: 2010-4-6 20:37

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.


C:\Documents and Settings\寒夜孤星>if "〇"=="" (echo 〇为空)else echo 〇不为空
〇为空


C:\Documents and Settings\寒夜孤星>if "12〇34"=="1234" (echo 相同)else echo 不同
相同


C:\Documents and Settings\寒夜孤星>if 12〇34==1234 (echo 相同)else echo 不同
相同


C:\Documents and Settings\寒夜孤星>


俺的系统是  xp sp3 。
作者: neorobin    时间: 2010-4-6 21:10

我也用的 WINXP SP3 CHS, 改了下代码, 显示字符串改了英文, 用了 chcp 437, 结果如愿了
  1. cd \ & @echo on & chcp 437 & ver
  2. if "〇"=="" (echo 〇 is empty) else echo 〇 is not empty
  3. if "12〇34"=="1234" (echo SAME) else echo NOT same
  4. if 12〇34==1234 (echo SAME) else echo NOT same
  5. if "12〇34" equ "1234" (echo SAME) else echo NOT same
  6. pause
复制代码
结果如下:
Active code page: 437

Microsoft Windows XP [?? 5.1.2600]

D:\>if "⌐û" == "" (echo ⌐û is empty )  else echo ⌐û is not empty
⌐û is not empty

D:\>if "12⌐û34" == "1234" (echo SAME )  else echo NOT same
NOT same

D:\>if 12⌐û34 == 1234 (echo SAME )  else echo NOT same
NOT same

D:\>if "12⌐û34" EQU "1234" (echo SAME )  else echo NOT same
NOT same

曾经也有一个 if 字符串比较的问题(关于短横线,单引号), 网上搜索未果, 到 MS 官网提问, 也没得到答案.
MS 不开源, 好多问题问 MS 也难得解答, 要弄清这类问题有时恐需用到 反编译, DEBUG 之类的手段对 CMD 来一个深度解剖, 我能力不及, 望有乐意用能力者试一下.

[ 本帖最后由 neorobin 于 2010-4-6 21:37 编辑 ]
作者: todayambition    时间: 2010-4-13 14:41

呵呵 有意思,不知道别的特殊符号有什么有什么效果
作者: zjw767676    时间: 2010-4-19 20:29

"〇"这个字符怎么来的?
作者: Demon    时间: 2012-8-13 16:00

本帖最后由 Demon 于 2012-8-13 16:03 编辑

if在内部是使用lstrcmpW函数来比较字符串是否相等的(详见《批处理技术内幕:IF命令》
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. int main()
  4. {
  5.     wchar_t s1[] = L"〇";
  6.     wchar_t s2[] = L"";
  7.     printf("%d\n", lstrcmpW(s1, s2));
  8.     return 0;
  9. }
复制代码
XP系统下返回0,Vista之后的系统返回1,也许是XP系统的lstrcmp函数有BUG?




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