中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 执行批处理出现乱码,何故?
作者:
标题: 执行批处理出现乱码,何故? 上一主题 | 下一主题
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『楼 主』:  执行批处理出现乱码,何故?

我的bat文件,出现了一个超奇怪的现象
我首先是运行了下面的批处理
@echo off
set/p a=<ttt.txt
for /f "tokens=1 delims=省" %%i in ("%a%") do echo %%i省
pause

ttt.txt的内容只有一行   湖南省长沙市

运行以后就会提示以下内容
(注:??代表两个汉字,我不会写,一个是"铁字"把右边的"失"换成"若"字,另一个是"纹"字把右边的"文"字换成"致"字)

??echo off
'??echo' 不是内部或外部命令,也不是可运行的程序

我再点右键-点编辑,居然发现
"for /f "tokens=1 delims=" %%i in ("%a%") do echo %%i"这一行里的两个"省"字变成了两个小黑方块,

然后我删除这个bat里的所有内容,再输入
@echo off
echo aaaaaa
pause
它也会出现上面的提示,
但和它在同一目录下的bat文件却没问题,于是我将那个能运行的bat文件内容复制到这个bat里来,一运行还是不行,并且显示的汉字全变成了一些奇怪的文字,

实在搞不懂了,杀毒也没用,恢复系统也还是一样,谁能帮帮我.......谢谢!!!谢谢!!!谢谢了!!!!!!!!!

[ Last edited by bjsh on 2007-7-31 at 10:11 AM ]

2007-6-23 14:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

估计是记事本程序判断编码类型的时候发生误判,所以出现乱码。
试试我的代码,应该没问题了。
@echo off
echo 我要看看是不是记事本程序发生了编码格式误判
set/p a=<ttt.txt
for /f "tokens=1 delims=省" %%i in ("%a%") do echo %%i省
pause


2007-6-23 18:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 3 楼』:  

谢谢你,确实编码的问题.
就是不明白怎么会这样的...
delims=后面不能是中文吗?
还有就是我昨天学习用了一下sed命令,和它有关吗?


2007-6-23 18:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  

FYI

  Quote:
2.批处理脚本的加密解密

批处理脚本的加密解密方法有多种,用得最多的是直接将bat转换成exe文件,大家直接到baidu搜索BAT转EXE,就知道怎么干了,
我今天教大叫其他一个简单的方法,直接将以下内容复制到一个空文文件里
%%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a %%a
@echo off
net user
net start


命令部分随便输入,但是命令后面不要有空格

破解方法:直接在cmd下用edit打开或者用word打开


原理:
记事本程序在保存一篇新建的文档时,如果没有指定编码类型,会使用缺省的ANSI类型(对于中文版来说,对应的就是GB码)。
而在打开一篇已创建的文档时,它会分析文档的编码类型,它首先判断文档头部有无BOM(Byte Order Mark,字节序标记,长
度为(2-3字节),如有则根据其内容判断编码类型,FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)
因为事实上有很多非ANSI编码的文档是没有任何BOM的“纯文本”,所以对这些文档不能简单的判断为ANSI编码。
   而需要使用一系列的统计学算法根据文档内容来猜测文档编码。记事本使用了 IsTextUnicode 函数来判断是否为
Unicode/Unicode big endian 编码,使用 IsTextUTF8 判断是否为 UTF8 编码。但既然是统计学算法,就难免存在误判
,尤其在文档内容过短时,由于样本的容量太小,这种误判的概率会显著增大。比如那个有名的微软与联通有仇的笑话,
就是记事本在打开只有"联通"二字的ANSI编码文档时,IsTextUTF8 函数将其误判为UTF8编码[2];同样的误判也发生在
IsTextUnicode 函数上,比如具有 “this app can break”这种具有4335结构的文档,会被误判为 Unicode 编码[3][4]。
   需要说明的是,这种误判的可能性是建立在文本较短且其字节位特征不被干扰的前提上的。如果将上述的文本做稍许修改(即使只是增加一个回车),则误判很难再发生。
   而这种方法的特殊性在于,它的字节串不但具有Unicode特征,而且很长达到了1288字节,也就是说它的Unicode特征性很强,所以可以抵抗一些较短的不具有Unicode特征串的干扰,这是由统计学的规律所决定的。但是在干扰串稍长时,Unicode的特征将会受到显著干扰,直至被 IsTextUnicode 函数认定为非 Unicode。所以,有些朋友总是无法测试成功,应该是与附加的批处理代码长度和内容相关。
   因为其他的编辑器(比如 Word / Wordpad / EditPlus / UltraEdit)使用了更新的编码类型判断算法,所以在 Unicode 判断上改进了不少,而 UTF8 的判断仍然不尽如人意。但因为理论上来说完全准确地算法并不存在,所以我们只能依靠避免使用无BOM的非ANSI文档,或者打开文档时手动指定编码类型。
  另外,如果使用记事本保存了这些误判了编码类型的文件,则将难以恢复。如果使用误判编码保存,则将给原文档加上BOM标记,则使用其他编辑器也再无法观察到原文档。如果使用 ANSI 编码保存,则原文档将会被当作 Unicode 文档而被转换,还原的可能性接近于零。



2007-6-23 19:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 5 楼』:  

高手..
佩服...........

2007-6-23 19:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 6 楼』:  

请问一下,为什么我的bat文件现在保存的任何东西的编码都是 UTF-8

输入再多的内容也是一样,怎么才能让他的默认选项是 ANSI

谢谢!

2007-7-4 04:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: