2

ランタイム環境: Python 2.7、Windows 7

注: PYTHON ソース コードによって生成されたファイルのエンコーディングについて話している (PYTHON ソース ファイルのエンコーディングについては話していない)。救われました。

文字列( )にASCII以外の文字が含まれていない場合content = 'abc'、ファイル( file.txtPYTHONソースファイルではなく)はfp.close()の後にANSIエンコーディングで保存されます。PYTHONファイル(およびANSIエンコーディング形式で保存されます)の内容は次のとおりです:

## Author: melo
## Email:prevision@imsrch.tk
## Date: 2012/10/12
import os

def write_file(filepath, mode, content):
    try:
        fp = open(filepath, mode)
        try:
            print 'file encoding:', fp.encoding
            print 'file mode:', fp.mode
            print 'file closed?', fp.closed
            fp.write(content)
        finally:
            fp.close()
            print 'file closed?', fp.closed
    except IOError, e:
        print e


if __name__ == '__main__':
    filepath = os.path.join(os.getcwd(), 'file.txt')
    content = 'abc'
    write_file(filepath, 'wb', content)

ただし、string( ) に ASCII 以外の文字が含まれているcontent = 'abc莹'場合、 file( )file.txtは の後に UTF-8 エンコーディングで保存されfp.close()ます。このときの PYTHON ソースファイルの内容は以下のとおりです。file.txt#encoding=gbk

# -*- encoding: gbk -*-
## Author: melo
## Email:prevision@imsrch.tk
## Date: 2012/10/12
import os

def write_file(filepath, mode, content):
    try:
        fp = open(filepath, mode)
        try:
            print 'file encoding:', fp.encoding
            print 'file mode:', fp.mode
            print 'file closed?', fp.closed
            fp.write(content)
        finally:
            fp.close()
            print 'file closed?', fp.closed
    except IOError, e:
        print e

if __name__ == '__main__':
    filepath = os.path.join(os.getcwd(), 'file.txt')
    content = 'abc莹'
    write_file(filepath, 'wb', content)

それがこのように振る舞うという証拠はありますか?

4

2 に答える 2

3

ファイルは、保存したエンコーディング保存されます。ソース ファイルは、保存したエンコーディング保存されます。同じである必要はありません。宣言する必要があります。

あなたの他の質問によると、私はあなたがメモ帳++を使用していると仮定し、開いたときにfile.txtメモ帳++がファイルがUTF-8 without BOM. これはNotepad++ による誤った推測です。中国語の GB2312 文字セットを選択すると、ファイルが正しく表示されます。

バイト オーダー マーク (BOM) やその他のメタデータによってヒントが与えられるか、ユーザーから指示されない限り、プログラムはファイルがどのエンコーディングに含まれているかわかりません。

正しい Python プログラムは、次のことを行います。

  1. ソース ファイルで非 ASCII 文字が使用されている場合は、ソース ファイルのエンコーディングを宣言します。
  2. すべてのテキストに Unicode 文字列を使用します。
  3. ファイルなどのバイナリ ストリームに出力するときに、Unicode 文字列をエンコードします。
  4. バイナリ ストリームからの読み取り時に、着信テキスト データを Unicode にデコードします。
  5. (オプション) 編集者がファイル エンコーディングを認識できるように、バイト オーダー マーク付きのエンコーディングを使用します。

例:

# encoding: utf-8
import codecs
with codecs.open('file.txt','wb',encoding='utf-8-sig') as f:
    f.write(u'abc莹')

file.txt'UTF-8' (BOM 付き) としてエンコードされていることが検出され、ファイルが適切に表示されるようになりました。

エンコーディングを として宣言すると、ファイルを 'ANSI' (システム上の GBK) で保存できますgbk。Unicode 文字列が使用されているため、ファイルは引き続き機能します。

cp936実際、お使いのシステムはおそらくGBK ではなくコード ページ 936 ( ) です。それらは正確に同じではありません。すべての Unicode 文字を正確に表現できる UTF-8 や UTF-16 などの Unicode エンコーディングを使用することをお勧めします。

于 2012-10-21T15:17:27.710 に答える
1
# -*- encoding: gbk -*-

PYTHON ファイルの先頭にある は、PYTHON ファイルのエンコーディングを示します。コーデックを使用するには、コーデックモジュールを使用します。

あなたはこれを必要とします:codecs.open()

于 2012-10-21T14:47:37.997 に答える