2

在 Windows 7 下使用 Python 2.7 尝试运行使用 utf-8 编码的 Windows 批处理文件时,无法识别批处理文件的第一个命令(参见示例)。

最有可能的是,bom 被解释为字符。如何让底层 shell 正确运行批处理文件?

调用的批处理文件来自第三方。这是一个重现问题的简单 python 脚本:

import codecs
import subprocess

content = "@echo off"
with codecs.open('test_utf8.bat', 'w', 'utf-8-sig') as f:
    f.write(content)
    f.close()

with open('test_ansi.bat', 'w') as f:
    f.write(content)
    f.close()

print "Calling test_ansi.bat"
subprocess.call('test_ansi.bat', shell=True)

print "Calling test_utf8.bat"
subprocess.call('test_utf8.bat', shell=True)

print "Done"

运行脚本会给出以下输出

t:\tmp\test>python test.py
Calling test_ansi.bat
Calling test_utf8.bat

t:\tmp\test>´╗┐@echo off
'´╗┐@echo' is not recognized as an internal or external command,
operable program or batch file.
Done

t:\tmp\test>

请注意,该shell参数似乎没有任何效果。

4

1 回答 1

3

行 。我会让你有理由使用 python 创建批处理文件,并在外部运行这些文件,而不是在 Python 中执行 - 以及你希望这些批处理在 utf-8 中而不是你的本机编码的理由Windows 或您的 DOS(因为两者不同的情况并不少见)。

这里是:只需编码为“utf-8”,而不是“utf-8-sig”。后者不是官方的变体,而是一种在 Windows 记事本中添加标记字节 (BOM) 的变体:“””增加了可以检测到 UTF-8 编码的可靠性,微软发明了一个变体UTF-8(Python 2.5 称之为“utf-8-sig”)的记事本程序:在将任何 Unicode 字符写入文件之前,一个 UTF-8 编码的 BOM(看起来像这样的字节序列:0xef , 0xbb, 0xbf) 被写入。因为任何charmap编码的文件都不太可能以这些字节值“””(http://docs.python.org/2/library/codecs.html)开头,但否则对于各种其他应用程序(如您所见,包括 Microsoft 的cmd)。

简而言之:编码为“utf-8”。如果要在 Windows 中编辑文件,请在生成文件后使用编辑器,而不是记事本,自 windows 3.0 天以来,记事本基本保持不变。(我想知道它现在是否可以打开大于 64kB 的文件)

于 2013-03-12T18:54:23.197 回答