批处理为乱码但可以正常执行的问题分析

摘要:
在这种情况下,在互联网上下载的用于实现某些Windows功能的批处理文件可以正常运行并达到预期的效果,但在编辑文本文件时发现它是乱码的,无法知道批处理文件是如何编写的。批处理可以正常执行,因为当批处理读取文本时,它将直接使用ansi进行解码,忽略文件头编码,因此跳过文件头编码。可以使用ansi对后续内容进行解码,以获得正确的文本内容并执行。以下省略了本文档的内容。

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

运行该批处理的界面是:

批处理为乱码但可以正常执行的问题分析第1张

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

批处理为乱码但可以正常执行的问题分析第2张

注意到右下角文本编码显示的是【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编码格式的,内容不就出来了吗?答案肯定是否定的!为什么呢,因为文本文档读取的源文件展示给你的就是错的,你以错的内容再另存为一下,不一样的是错的吗?相当于数学题第一步就做错了,结果的答案无疑就是错的。

免责声明:文章转载自《批处理为乱码但可以正常执行的问题分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇怎么理解Laravel的核心架构C# winIO32位,64位的使用(运行时要用管理员身份)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQL Server 列存储索引 第一篇:概述

SQL Server 列存储系列: SQL Server 列存储索引 第一篇:概述 SQL Server 列存储索引 第二篇:设计 SQL Server 列存储索引 第三篇:维护 SQL Server 列存储索引 第四篇:实时运营数据分析 在2017年,我第一次接触列存储索引(ColumnStore),数据库环境是SQL Server 2012,微软...

SQL SERVER事务处理

事务定义: 事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会 提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有 数据更改均被清除。 事务三种运行模式:自动提交事务每条单独的语句都是一个事务。显式事务每个事务均以BEGIN TRANSACTION语句显式开始,以COMMIT或ROLLBACK语句显式结束。隐...

批处理·命令行中常用的操作

偶尔会有做点自动化的需求,以往每次写批处理文件都是现查。今天把用到的批处理常用操作做个记录。 1.批处理文件的调用与传参 a.bat ./b.bat Hello Wrold REM 或 REM call b.bat Hello Wrold b.bat set param1=%1 set param2=%2 echo %param1% echo %...

Flink初探-为什么选择Flink

本文主要记录一些关于Flink与storm,spark的区别, 优势, 劣势, 以及为什么这么多公司都转向Flink. What Is Flink 一个通俗易懂的概念: Apache Flink 是近年来越来越流行的一款开源大数据计算引擎,它同时支持了批处理和流处理.这是对Flink最简单的认识, 也最容易引起疑惑, 它和storm和spark的区别在哪里...

Mysql 批处理多条sql语句

package cn.itcast.demo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test; import cn.it...

uglifyjs压缩批处理

uglifyjs. 据说是用来压缩JS文件的,据说还能优化JS,据说是基于node的,还据说比Google Closure Compiler更带感。 uglifyjs压缩批处理我们不可能每次都打开cmd去键入压缩执行代码,容易写错不说(如上面那个结果图),还耗时,想想都会让人疯掉。懒人有懒法,花了点功夫,折腾了一个批处理文件,以后,想要压缩JS,只要双击运...