windows 批量比较然后跳过文件第一行的 utf ∩╗┐

windows 批量比较然后跳过文件第一行的 utf ∩╗┐

我想要批量列出文件的行,并且如果是 UTF 文件,则跳过第一行中的“∩╗┐”字符。

@echo off  
setlocal EnableExtensions EnableDelayedExpansion
for /f "delims=" %%a in (list.txt) do (
 set /a count+=1
 set "Line[!count!]=%%a"
) 
echo "!Line[1]:~0!"
echo "!Line[1]:~0,3!"
if "!Line[1]:~0,3!" == "" set "Line[1]=!Line[1]:~3!"
echo "!Line[1]:~0!"
echo "!Line[1]:~3!"

Pause>nul

但是“∩╗┐”字符在表达上是无法比较的:

if "!Line[1]:~0,3!" == "" set "Line[1]=!Line[1]:~3!"

答案1

您的list.txt已保存在带字节顺序标记的 UTF-8 编码∩╗┐角色的外观UTF-8 字节顺序标记编码中的字节数CP437(也请参见下面的示例)。

非 UTF-8 软件可能会将 BOM 显示为三个垃圾字符,例如, ""在将文档解释为 ISO 8859-1 或 Windows-1252 的软件中,以及"∩╗┐"在解释为代码页 437 时。这是莫吉巴克,当使用非预期的字符编码解码文本时,会输出乱码文本。

我猜你的脚本保存在合称为“ANSI”(CP1252)编码,因此改用

if "!Line[1]:~0,3!" == "" set "Line[1]=!Line[1]:~3!"

示例;(添加了代码页 1250 的实例,结果产生了 mojibake ):

chcp 1250
type D:\bat\SU\list1545301_UTF8-BOM.txt
chcp 1252
type D:\bat\SU\list1545301_UTF8-BOM.txt
chcp 437
type D:\bat\SU\list1545301_UTF8-BOM.txt
Active code page: 1250
this is line1
this is line2

Active code page: 1252
this is line1
this is line2

Active code page: 437
this is line1
this is line2

相关内容