python2.Xコード問題の整理
まずこれらの問題はpython 2のみである.Xバージョンが3.Xバージョンのpython環境にはunicodeタイプの文字列しかありません.つまり、すべてのプログラムで処理される文字列が自動的にunicode文字列に変換されます.では2.Xのpythonプログラム開発では,符号化の問題をどのように回避し,整理するか.まず良い統一ルールを維持しなければなりません.そうしないと、すべてが無駄になります.統一はutf-8を使うのが一番です.
pythonで使用されるエンコードの違いは、次のとおりです.
1、pythonソースファイルの符号化2、pythonランタイム環境の符号化3、pythonプログラムが受信する外部入力文字列の符号化
まず、ソースファイルの符号化はファイル中の非英語文字の符号化と保存方式であり、デフォルトはオペレーティングシステムのデフォルト符号化である.この符号化はシステムのlocaleによって決定される【systeminfo.exeで調べることができる】であり、例えばlocaleがzh-CNに設定されている場合、そのデフォルト符号化はASCII符号【locale.getdefaultlocale()であるソースファイルに英字以外の文字がある場合に符号化エラーが発生するため、解決策はソースファイルのヘッダに1行の符号化指定を追加することであり、例えば:#-*-coding:utf-8-*---、これはソースファイルの英字以外の符号化方式を指定することである.
次に、ランタイム環境の符号化、pythonで実行時にまずシステムlocaleの情報【locale.getdefaultlocale()】を取得します.例えば、zh-CNのデフォルト符号化はASCII符号で、英語文字の復号には正常で、マルチバイト文字に遭遇すると、ファイルシステムのデフォルト符号化【sys.getdefaultencoding()】、zh-CNの場合はGBKです.これがwindowsシステムのコマンドライン環境でpythonを起動する効果で、すべての入力文字列はstrタイプで、英語はasciiタイプで、中国語はgbkタイプです.同様にpythonにはunicode関数があり、文字列を復号する際に前述した論理セットが使用されます.さらにpython環境で符号化を設定する方法については、まずunicode文字を直接設定します.例えば、u'中国語'です.これは、1つの文字列をunicode文字列に直接変換することです.どの符号化環境でも、このような文字列を入力すると、それに応じてunicode文字列に復号されます.また、python実行環境符号化【sys.getdefaultencoding()】を設定し、zh-CNではデフォルトでGBKですが、python環境ではデフォルトの復号方式でこの設定の符号化が使用されます.
再度、外部入力の符号化、例えばファイルの読み取り;内蔵のopen()メソッドでファイルを開くとread()はstrを読み出し、読み出し後に正しい符号化フォーマットでdecode()を行う必要があります.write()書き込みの場合、パラメータがunicodeの場合は、書き込みたい符号化を用いてencode()を行い、他の符号化フォーマットのstrの場合は、まずそのstrの符号化を用いてdecode()を行い、unicodeに変換してから書き込みの符号化を用いてencode()を行う必要がある.unicodeを直接パラメータとしてwrite()メソッドに入力すると、Pythonはソースファイルで宣言された文字符号化を使用して符号化して書き込みます.
まとめて、基本的にこの3つの段階で統一的な符号化を使用しているので、自然に大きな問題はありませんが、上の3つの段階のうち最初の2つは私たちが制御することができ、3つ目は使用者と関係があり、確定できませんが、私たちはユーザーや外部入力を受信するときにそれを符号化して識別することができ、文字を受信すると同時に最初の時間にunicodeに復号することができます.これにより,符号化問題の発生を最小限に抑えることができる.
pythonで使用されるエンコードの違いは、次のとおりです.
1、pythonソースファイルの符号化2、pythonランタイム環境の符号化3、pythonプログラムが受信する外部入力文字列の符号化
まず、ソースファイルの符号化はファイル中の非英語文字の符号化と保存方式であり、デフォルトはオペレーティングシステムのデフォルト符号化である.この符号化はシステムのlocaleによって決定される【systeminfo.exeで調べることができる】であり、例えばlocaleがzh-CNに設定されている場合、そのデフォルト符号化はASCII符号【locale.getdefaultlocale()であるソースファイルに英字以外の文字がある場合に符号化エラーが発生するため、解決策はソースファイルのヘッダに1行の符号化指定を追加することであり、例えば:#-*-coding:utf-8-*---、これはソースファイルの英字以外の符号化方式を指定することである.
次に、ランタイム環境の符号化、pythonで実行時にまずシステムlocaleの情報【locale.getdefaultlocale()】を取得します.例えば、zh-CNのデフォルト符号化はASCII符号で、英語文字の復号には正常で、マルチバイト文字に遭遇すると、ファイルシステムのデフォルト符号化【sys.getdefaultencoding()】、zh-CNの場合はGBKです.これがwindowsシステムのコマンドライン環境でpythonを起動する効果で、すべての入力文字列はstrタイプで、英語はasciiタイプで、中国語はgbkタイプです.同様にpythonにはunicode関数があり、文字列を復号する際に前述した論理セットが使用されます.さらにpython環境で符号化を設定する方法については、まずunicode文字を直接設定します.例えば、u'中国語'です.これは、1つの文字列をunicode文字列に直接変換することです.どの符号化環境でも、このような文字列を入力すると、それに応じてunicode文字列に復号されます.また、python実行環境符号化【sys.getdefaultencoding()】を設定し、zh-CNではデフォルトでGBKですが、python環境ではデフォルトの復号方式でこの設定の符号化が使用されます.
import sys
reload(sys)# Python2.5 sys.setdefaultencoding ,
sys.setdefaultencoding('utf-8')
再度、外部入力の符号化、例えばファイルの読み取り;内蔵のopen()メソッドでファイルを開くとread()はstrを読み出し、読み出し後に正しい符号化フォーマットでdecode()を行う必要があります.write()書き込みの場合、パラメータがunicodeの場合は、書き込みたい符号化を用いてencode()を行い、他の符号化フォーマットのstrの場合は、まずそのstrの符号化を用いてdecode()を行い、unicodeに変換してから書き込みの符号化を用いてencode()を行う必要がある.unicodeを直接パラメータとしてwrite()メソッドに入力すると、Pythonはソースファイルで宣言された文字符号化を使用して符号化して書き込みます.
まとめて、基本的にこの3つの段階で統一的な符号化を使用しているので、自然に大きな問題はありませんが、上の3つの段階のうち最初の2つは私たちが制御することができ、3つ目は使用者と関係があり、確定できませんが、私たちはユーザーや外部入力を受信するときにそれを符号化して識別することができ、文字を受信すると同時に最初の時間にunicodeに復号することができます.これにより,符号化問題の発生を最小限に抑えることができる.
if s.decode('utf-8', REPLACE)==s.decode('utf-8', IGNORE):
s = s.decode('utf-8')
elseif ....
....