我想要批量列出文件的行,并且如果是 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