まず Python のバージョンを見てみましょう:
>>> import sys
>>> sys.version
'2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [ MSC v .1310 32 ビット (Intel)]'
(1)
メモ帳を使用してファイル ChineseTest.py を作成します。デフォルトの ANSI:
s = "中国語"
print s
テストして確認してください:
E:ProjectPythonTest>python ChineseTest.py
ファイル " ChineseTest.py"、行 1
SyntaxError: 非 ASCII 文字 'xd6'ファイル ChineseTest.py の 1 行目でエンコーディングが宣言されていません。詳細については、http://www.python.org/peps/pep-0263.html を参照してください。
ファイル エンコーディングを密かに UTF-8 に変更します。
E:ProjectPythonTest>python ChineseTest.py
ファイル " ChineseTest.py"、行 1
SyntaxError: ファイル ChineseTest.py の行 1 に非 ASCII 文字 'xe4' がありますが、エンコーディングが宣言されていません。詳細については http://www.python.org/peps/pep-0263.html
は役に立ちません。 。 。
URL が提供されるので、見てみましょう。簡単に閲覧した結果、ファイル内に非 ASCII 文字が含まれている場合は、1 行目または 2 行目にエンコーディング ステートメントを指定する必要があることがわかりました。 ChineseTest.py ファイルのエンコードを ANSI に変更し、エンコード ステートメントを追加します:
#coding=gbk
s = " Chinese"
print s
再試行:
E :ProjectPythonTest>python ChineseTest.py
中国語
通常:)
(2)
長さを見てください:
#coding =gbk
s = "中文"
print len(s)
結果: 4.ここの
は str 型なので、計算すると漢字 1 文字が英語 2 文字に相当するため、長さは 4 になります。
次のように書きます:
#coding=gbk
s = "中文"
s1 = u"中文"
s2 = unicode(s, "gbk") #パラメータを省略すると、 python デコードするデフォルトの ASCII
s3 = s.decode("gbk") #str を Unicode に変換することはデコードであり、Unicode 関数は同じ効果があります
print len(s1)
print len(s2)
print len(s3)
結果:
2
2
2
(3)
次に、ファイル処理を見てみましょう:
ファイル test.txt を作成します。ファイル形式は ANSI、内容は次のとおりです:
abc Chinese
Python を使用して
#coding=gbk
print open("Test.txt") を読み取ります。 read( )
結果: abc 中国語
ファイル形式を UTF-8 に変更します:
結果: abc涓枃
明らかに、ここではデコードが必要です:
#coding=gbk
import codecs
print open("Test.txt").read().decode("utf-8")
結果: abc Chinese
上記の test.txt の編集には Editplus を使用しましたが、 Windows に付属のメモ帳を使用して編集し、UTF-8 形式で保存すると、
実行時にエラーが発生します:
トレースバック (最新の呼び出しは最後):
ファイル " ChineseTest.py",行 3、
print open("Test.txt").read().decode("utf-8")
UnicodeEncodeError: 'gbk' コーデックは文字 u'ufeff' をエンコードできません位置 0: 不正なマルチバイト シーケンス
メモ帳などの一部のソフトウェアは、UTF-8 でエンコードされたファイルを保存するときに、ファイルの先頭に 3 つの非表示文字 (0xEF 0xBB 0xBF、または BOM) を挿入することが判明しました。ファイル。 。
したがって、読み取り時にこれらの文字を自分で削除する必要があります。Python のコーデック モジュールは次の定数を定義します。
#coding=gbk
import codecs
data = open("Test.txt") .read ()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
print data.decode("utf-8")
結果: abc 中国語
(4) 残った問題
後半では、unicode 関数と decode メソッドを使用して str を Unicode に変換します。これら 2 つの関数のパラメーターに「gbk」が使用されるのはなぜですか?
最初の反応は、コーディング ステートメントで gbk (#coding=gbk) を使用しているということですが、これは本当にそうなのでしょうか?
ソース ファイルを変更します:
#coding=utf-8
s = "中国語"
print unicode(s, "utf-8")
実行、エラー メッセージ:
トレースバック (最新の呼び出しは最後):
ファイル " ChineseTest.py"、行 3、
s = unicode(s, "utf-8")
UnicodeDecodeError: 'utf8' コーデックは可能です' t 位置 0-1 のバイトをデコードします: 無効なデータ
明らかに、以前の正常性が両側で gbk が使用されているためである場合、ここでは両側で utf-8 の一貫性を維持し、正常である必要があります。エラーが報告されます。
ここでも変換に gbk を使用する場合のさらなる例:
#coding=utf-8
s = "中国語"
print unicode(s, "gbk")
結果:中国語
Python での print の原理を大まかに説明している英語の資料を読みました。
Python が print ステートメントを実行すると、出力がオペレーティング システムに (fwrite() などを使用して) 渡されるだけです。たとえば、Windows では、Windows コンソール サブシステムが結果を表示します。また、Windows を使用していて、他の場所で Python を実行している場合は、他のプログラムがその出力を画面に表示します。実際にデータを表示するのは Windows SSH クライアントです。Unix 上の xterm で Python を実行している場合、xterm と X サーバーが表示を処理します。
データを確実に出力するには、次のことを理解しておく必要があります。
簡単に言えば、Python の print は文字列をオペレーティング システムに直接渡すため、オペレーティング システムと一致する形式に str をデコードする必要があります。 Windows は CP936 (gbk とほぼ同じ) を使用するため、ここでは gbk を使用できます。
最終テスト:
#coding=utf-8
s = "中国語"
print unicode(s, "cp936")
結果: 中国語