为什么Windows命令提示符和批处理文件的编码存在差异?

9
例如,假设我有一个名为'test.cmd'的批处理文件,它只包含以下内容:
echo %1

我可以直接通过命令提示符调用 'test.cmd some¬arg' 来运行它,并且结果是打印出字符串 'some¬arg'

然而,如果我将同样的调用放在第二个批处理文件中,例如名为 'tester.cmd',并从命令提示符调用它,则结果是打印出字符串 'some%arg'

是什么导致了编码问题,如何解决?我确定我以前修复过这个问题,但我记不清楚怎么做了...

谢谢!


1
你确定那是一个百分号吗?在我的机器上它是一个“¼”。 - Tomalak
1个回答

10
这是因为您的批处理文件使用的编码与当前cmd.exe所在的编码页不同。
在西方默认配置中,cmd.exe以CP850启动,但文本编辑器通常使用CP1252(经常错误地称为Latin-1或ISO-8859-1)。
这两个编码页中,字符“¬”和“¼”共享相同的字符代码“BC”。
解决方法很简单。要么将批处理文件编码为代码页850,要么通过发出chcp 1252将cmd.exe切换到代码页1252。

那么,您的建议是我可以在批处理文件的顶部使用chcp 1252,然后在for循环中就不需要再使用双%%符号了? - djangofan
@djangofan 不,完全不是。双 %% 是命令处理器本身的要求,与字符编码无关。 - Tomalak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接