批处理文件编码(Batch file encoding)

2019-07-18 03:05发布

我想处理包含文件名奇怪的字符,像法国é。

一切都在外壳做工精细:

C:\somedir\>ren -hélice hélice

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

C:\somedir\>ren -hÚlice hÚlice

看到了吗? é已被替换用u。

这同样适用于命令输出正确的。 如果我dir在外壳的一些目录,输出是罚款。 如果我这个输出重定向到一个文件中,某些字符被转换。

所以,我怎么能告诉CMD.EXE如何解释这似乎为我的批处理文件的E,是一个真正的é而不是U或逗号?

因此,有执行.bat文件时,提供与上面写的代码页的暗示没有办法?

Answer 1:

你必须保存与OEM编码批处理文件。 如何做到这一点取决于你的文本编辑器而异。 在这种情况下,所使用的编码而变化为好。 对于西方文化中它通常是CP850。

批处理文件和编码是真正的两件事情,特别不喜欢对方。 你会发现,Unicode是也不能使用那里,不幸的是(即使环境变量处理得很好)。

或者,您可以设置控制台使用另一个代码页:

chcp 1252

应该做的伎俩。 至少它为我工作在这里。

当你做输出重定向,如用dir ,适用同样的规则。 控制台窗口的代码页中。 您可以使用/u切换到cmd.exe强制Unicode的输出重定向,这会导致生成的文件是在UTF-16。

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

  • 什么编码/代码页是使用cmd.exe的

编辑:至于你编辑:没有, cmd总是假定被写在控制台默认代码页的批处理文件。 然而,你可以很容易地包括chcp在批的开始:

chcp 1252>NUL
ren -hélice hélice

为了使这更健壮直接在命令行中使用时,你可能要记住旧代码页和事后恢复它:

@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


Answer 2:

我创建了以下块,我把在我的批处理文件的开头:

set Filename=%0
IF "%Filename:~-8%" == "-850.bat" GOTO CONVERT_CODEPAGE_END
    rem Converting code page from 1252 to 850.
    rem My editors use 1252, my batch uses 850.
    rem We create a converted -850.bat file, and then launch it.
    set File850=%~n0-850.bat
    PowerShell.exe -Command "get-content %0 | out-file -encoding oem -filepath %File850%"
    call %File850%
    del %File850%
    EXIT /b 0
:CONVERT_CODEPAGE_END


Answer 3:

我是有这个麻烦,这里是我找到了解决办法。 查找您正在寻找在当前的代码页的字符的十进制数。

例如,我在代码页437( chcp告诉你),我想一定程度的标志。 http://en.wikipedia.org/wiki/Code_page_437告诉我,度符号数248。

然后,你发现有相同数量的Unicode字符。

在248中的Unicode字符(U + 00F8)的。

如果您在批处理脚本插入Unicode字符,它会显示在控制台你想要的字符。

所以我的批处理文件

echo

版画

°


Answer 4:

我关心的三个概念:

  1. 输出控制台编码

  2. 命令行内部编码(即改变与CHCP)

  3. .BAT文本编码

最简单的场景对我说:我会在相同的编码中提到的前两个,说CP850,我将我的.bat存储在相同的编码(在记事本++,菜单→ 编码 字符集西欧 →OEM 850)。

但是,假设有人给我另一种编码一个.BAT,说CP1252(在记事本++,菜单编码*→ 字符集西欧 →Windows的1252)

然后我想改变命令行内部编码,与CHCP 1252。

这改变了它使用与其他进程交谈编码,无论是输入装置也没有输出控制台。

所以我的命令行实例将有效地通过它的标准输出的文件描述符发在1252个字符,但是当控制台解码出来为850(E为U)出现gabbed文本。

然后我修改了文件,如下所示:

@echo off

perl -e "use Encode qw/encode decode/;" -e "print encode('cp850', decode('cp1252', \"ren -hlice hlice\n\"));"
ren -hlice hlice

首先我把回声关闭,因此该命令不输出,除非明确地做任何回音......或Perl -e“打印...”

然后,我每一次我需要输出的东西把这个样板

的perl -e “使用编码QW /编码解码/;” -e “打印编码( 'CP850',解码( 'CP1252',\” 仁-hélice厚蟹\ n \ “));”

我代替实际的文字,我会告诉这个人:任-hélice厚蟹。

而且我需要替换我的控制台编码CP850和对方编码CP1252。

而就在下面,我把所需的命令。

我也打破了问题的行到输出一半,真正的命令一半。

  • 第一个是我做肯定的:在“E”被解释为一个“E”通过转码的手段。 因为控制台和文件在不同的编码,有必要对所有的输出语句。

  • 第二,真正的命令(关闭@echo喃喃自语),知道我们有相同的编码无论是从CHCP和蝙蝠的文字就足以确保正确的字符解释。



Answer 5:

我曾在R(如:A,E,Z,Z等)里面的代码抛光标志和有问题.bat文件运行时,该R脚本 (在输出文件.Rout,而不是那些迹象有样症状%,&#等,以及代码并没有运行到结束)。

我的解决方案:

  1. 与编码保存[R脚本:文件>保存与编码> CP1250
  2. 运行.bat文件

它为我工作,但如果仍有问题,尝试使用其他的编码。



文章来源: Batch file encoding