zoukankan      html  css  js  c++  java
  • 批处理为乱码但可以正常执行的问题分析

    有这样一种情况,在网上下载的用于实现某些Windows功能的批处理文件,能够正常运行并取得预期效果,但编辑该文本文件,发现是乱码,无法知道该批处理是如何写的。下图示例该批处理:

    运行该批处理的界面是:

    编辑该批处理显示的内容是:

    注意到右下角文本编码显示的是【UTF-16 LE】,文本是乱码,首先应该想到的是编码错误,也就是该文件用notepad打开是用【UTF-16 LE】的方式解码的,而实际上该文本不是这个编码。

    批处理能够正常执行是因为批处理读取该文本的时候会直接用ansi来解码,无视文件头编码,因此跳过了文件头编码,后面的内容用ansi来解码能够获取到正确的文本内容并执行。下面我们来验证一下是不是这样的。用python以二进制形式打开这个文件

    #data=open('special1.bat','rb').read()
    #data
    b'xffxfe
    cls
    @echo off
    :Start
    echo xc7xebxd1xa1xd4xf1xd2xaaxb2xd9xd7xf7xb5xc4xb7xbdxcaxbdxa1xbe1xcexaaxd0xc2xbdxa8xcfxeexc4xbfxa3xbb2xcexaaxc9xbexb3xfdxcfxeexc4xbfxa3xbb3xcexaaxccxedxbcxd3xd7xd3xb2xcbxb5xa5xa1xbf
    echo xc8xe7xb9xfbxd2xaaxc9xbexb3xfdxcfxeexc4xbfxa3xacxc4xe3xd0xe8xd2xaaxcaxe4xc8xebxd6xaexc7xb0xd0xc2xbdxa8xcfxeexc4xbfxb5xc4CLSIDxbaxc5xa1xa3
    set /p Choices=
    
    if %Choices%==1 goto AddIcon
    if %Choices%==2 goto DeleteIcon
    if %Choices%==3 goto SubCommand
    goto Start
    
    
    :AddIcon
    echo xc7xebxcaxe4xc8...后面省略

    我们看到这个文件的开头是xffxfe,即【UTF-16 LE】,我们跳过前面的2个字节的编码,提取剩余的字节内容,进行cp936解码

    #print(data[2:].decode('cp936'))
    
    cls
    @echo off
    :Start
    echo 请选择要操作的方式【1为新建项目;2为删除项目;3为添加子菜单】
    echo 如果要删除项目,你需要输入之前新建项目的CLSID号。
    ...
    以下省略

     
    该文件的内容就此出来了。
    但可能你会提问,既然是ansi编码,那么我编辑此文档,然后另存为ansi编码格式的,内容不就出来了吗?答案肯定是否定的!为什么呢,因为文本文档读取的源文件展示给你的就是错的,你以错的内容再另存为一下,不一样的是错的吗?相当于数学题第一步就做错了,结果的答案无疑就是错的。

  • 相关阅读:
    转贴:.net中using的几种用途
    codebehind的优先权大于codeinline
    access的存储过程
    11.26笔记
    vs2005中的快捷键总结
    关于填充datagrid
    猫叫了,所有老鼠开始逃跑经典面试题
    面向对象的三个基本特征(讲解)
    在中文VS2008中安装ASP.NET MVC框架
    测试驱动开发全功略
  • 原文地址:https://www.cnblogs.com/boltkiller/p/14611933.html
Copyright © 2011-2022 走看看