2

Windows 7 で Python 2.7 を使用して、utf-8 でエンコードされた Windows バッチ ファイルを実行しようとすると、バッチ ファイルの最初のコマンドが認識されません (例を参照)。

ほとんどの場合、bom は文字として解釈されます。基になるシェルでバッチ ファイルを適切に実行するにはどうすればよいですか?

呼び出されたバッチ ファイルは、サード パーティからのものです。問題を再現する簡単な 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

Ok 。Pythonを使用してバッチファイルを作成し、それらのファイルをPythonで実行する代わりに外部で実行する理由と、それらのバッチをネイティブエンコーディングではなくutf-8で実行する理由を説明します. Windows または DOS (両方が異なることは珍しくありません)。

「utf-8-sig」ではなく、「utf-8」にエンコードするだけです。後者は公式の亜種ではなく、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 に答える