批处理文件编码

sho*_*nex 53 windows encoding cmd batch-file

我想处理包含奇怪字符的文件名,比如法语é.

shell中的一切都运行良好:

C:\somedir\>ren -hélice hélice
Run Code Online (Sandbox Code Playgroud)

我知道如果我把这行放在.bat文件中,我得到以下结果:

C:\somedir\>ren -hÚlice hÚlice
Run Code Online (Sandbox Code Playgroud)

看?é已被Ú取代.

命令输出也是如此.如果我dir在shell中有一些目录,输出就可以了.如果我将此输出重定向到文件,则会转换某些字符.

那么我怎么能告诉cmd.exe如何解释我的批处理文件中出现的é,实际上是é而不是Ú或逗号?

因此,执行.bat文件时无法提供有关其编写代码页的提示?

Joe*_*oey 67

您必须使用OEM编码保存批处理文件.如何执行此操作因文本编辑器而异.在这种情况下使用的编码也有所不同.对于西方文化,它通常是CP850.

批处理文件和编码实际上是两件彼此并不特别相似的东西.你会注意到Unicode也不可能在那里使用,不幸的是(即使环境变量处理得很好).

或者,您可以将控制台设置为使用其他代码页:

chcp 1252
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.至少它在这里对我有用.

当您输出重定向(例如with)时dir,将应用相同的规则.使用控制台窗口的代码页.您可以使用该/u开关cmd.exe强制Unicode输出重定向,这会导致生成的文件为UTF-16.

至于编码和代码页cmd.exe一般,也看到这个问题:

编辑:至于您的编辑:不,cmd始终假定批处理文件写入控制台默认代码页.但是,您可以chcp在批处理的开头轻松添加:

chcp 1252>NUL
ren -hélice hélice
Run Code Online (Sandbox Code Playgroud)

为了在直接从命令行使用时使其更加健壮,您可能需要记住旧代码页并在之后恢复它:

@echo off
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 1252>nul
ren -hélice hélice
chcp %cp%>nul
Run Code Online (Sandbox Code Playgroud)

  • `chcp 1252`就像魔术,它甚至修复了我的Perl脚本! (2认同)