ホームページ  >  記事  >  バックエンド開発  >  Python コーディングの概要 (エンコーディングの種類、形式、トランスコーディング)

Python コーディングの概要 (エンコーディングの種類、形式、トランスコーディング)

高洛峰
高洛峰オリジナル
2017-03-01 13:30:261610ブラウズ

この記事ではPythonのコーディングについて詳しくまとめています。参考のために皆さんと共有してください。詳細は次のとおりです。

[いわゆる Unicode]

Unicode は、シンボルのバイナリ コードを指定するだけですが、シンボル セットに似た抽象的なエンコードです。このバイナリ コードをどのように保存するかについては指定しません。つまり、これは内部表現のみであり、直接保存することはできません。そのため、保存する際にはutf-8やutf-16などの保存形式を指定する必要があります。理論上、Unicode は世界中のすべての言語に対応できるエンコード方式です。 (他のエンコード形式についてはこれ以上詳しくありません)

[いわゆる GB コード]

GB は「国家標準」、つまり中華人民共和国の国家標準を意味します。 GB コードは、GB2312 (GB2312-80)、GBK、GB18030 などの漢字のコーディングであり、表現範囲は小さいものから大きいものまで増加し、基本的に下位互換性があります。また、CP936 というコードもよく見かけますが、これは実際には GBK とほぼ同じと考えられます。

【エンコードの判定】

1. isinstance(s, str) を使用して、文字列が一般的な文字列 (str は ASCII 型の文字列、utf-8、utf-16、GB2312、GBK など) であるかどうかを判断します。はすべて ASCII タイプの文字列です);

文字列が Unicode でエンコードされた文字列であるかどうかを判断するには、isinstance(s, unicode) を使用します (Unicode でエンコードされた文字列は Unicode タイプの文字列です)。

2. type() または .__class__ を使用します

エンコーディングが正しい場合:

例: stra = "中" の場合、type(stra) を使用した結果は になります。 ASCII 型文字列を意味します。

例: strb = u"中" の場合、type(strb) を使用した結果は となり、これが Unicode 型文字列であることを示します。


tmp_str = 'tmp_str'
print tmp_str.__class__   #<type &#39;str&#39;>
print type(tmp_str)    #<type &#39;str&#39;>
print type(tmp_str).__name__ #str
tmp_str = u&#39;tmp_str&#39;
print tmp_str.__class__   #<type &#39;unicode&#39;>
print type(tmp_str)    #<type &#39;unicode&#39;>
print type(tmp_str).__name__ #unicode


3. 特に HTML ページのコンテンツをクロールするときなど、Web 関連の操作では、ページの charset タグがエンコーディングのみを示す場合があるため、chardet を使用して判断するのが最善の方法です。これは誤りであり、ページ コンテンツ内の一部の中国語の文字が、マークされたエンコーディングの範囲を超える可能性があります。この場合、文字セット検出を使用するのが最も便利で正確です。

(1) インストール方法:chardetをダウンロード後、解凍したchardetフォルダをPythonインストールディレクトリのLibsite-packagesディレクトリに配置し、プログラム内でimport chartetを使用します。

(2) 使用方法 1: すべてのコンテンツを検出してエンコーディングを決定します


import urllib2
import chardet
res = urllib2.urlopen(&#39;http://www.php.cn&#39;)
res_cont = res.read()
res.close()
print chardet.detect(res_cont) #{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}


detect 関数の戻り値は、2 つのキーと値のペアを含む辞書です。 2 つ目は、検出されたエンコード形式です。

(3) 方法2: コンテンツの一部を検出してエンコードを決定し、速度を向上させます


import urllib2
from chardet.universaldetector import UniversalDetector
res = urllib2.urlopen(&#39;http://www.php.cn&#39;)
detector = UniversalDetector()
for line in res.readlines():
 #detect untill reach threshold
 detector.feed(line)
 if detector.done:
  break
detector.close()
res.close()
print detector.result
#{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}


【エンコードを変換】

1. 特定のエンコード(ISO-8859-1)から[ASCII コード] 、utf-8、utf-16、GBK、GB2312 など) を Unicode に変換するには、unicode(s, charset) または s.decode(charset) を直接使用します。ここで、charset は s のエンコーディングです (注) decode() を使用すると Unicode が変更されます。エラー);実際の全角スペースは xa1xa1 です)、エラーが報告されます。

解決策: 「ignore」モード、つまり stra.decode('...', 'ignore').encode('utf-8') を使用します。

説明: decode の関数プロトタイプは decode([encoding],[errors='strict']) で、2 番目のパラメーターを使用してエラー処理戦略を制御できます。


デフォルトのパラメータは strict です。つまり、無効な文字が見つかった場合は例外がスローされます。ignore に設定されている場合、無効な文字は無視されます。xmlcharrefreplace に設定されている場合、無効な文字は ? に置き換えられます。 XMLは文字参照を使用します。

2. Unicode から特定のエンコーディングに変換するには、s.encode(charset) も直接使用されます。s は Unicode エンコーディング、charset は特定のエンコーディングです (encode( を使用すると、非 Unicode ではエラーが発生することに注意してください) ));

3 , 当然のことながら、ある特定のエンコーディングから別の特定のエンコーディングに変換するには、まず Unicode にデコードしてから、最終的なエンコーディングにエンコードできます。

[Python コマンド ライン エンコーディング (システム エンコーディング)]

Python 独自のロケール モジュールを使用して、コマンド ラインのデフォルト エンコーディング (システム エンコーディング) を検出し、コマンド ライン エンコーディングを設定します:

#将任意字符串转换为unicode
def to_unicode(s, encoding):
 if isinstance(s, unicode):
  return s
 else:
  return unicode(s, encoding)

現在のシステムの内部エンコーディングが GBK に似た cp936 であることを示します。実際、中国製 XP および WIN7 の内部システム エンコーディングは cp936 (GBK) です。


【Pythonコードのエンコーディング】


1. Pythonコードの文字列にエンコーディングが指定されていない場合、デフォルトのエンコーディングはコードファイル自体のエンコーディングと一致します。たとえば、文字列 str = ' Chinese' が utf8 エンコードされたコード ファイル内にある場合、文字列は utf8 でエンコードされ、gb2312 ファイル内にある場合、文字列は gb2312 でエンコードされます。では、コード ファイル自体のエンコーディングはどうやって知ることができるのでしょうか?

(1) コードファイルのエンコードを自分で指定します。コードファイルの先頭に「#-*-coding:utf-8 -*-」を追加して、コードファイルが utf-8 エンコードであることを宣言します。このとき、エンコードが指定されていない文字列のエンコードはutf-8となります。

(2)在没有指定代码文件的编码时,创建代码文件时使用的是python默认采用的编码(一般来说是ascii码,在windows中实际保存为cp936(GBK)编码)。通过sys.getdefaultencoding()和sys.setdefaultencoding('...')来获取和设置该默认编码。


import sys
reload(sys)
print sys.getdefaultencoding() #ascii
sys.setdefaultencoding(&#39;utf-8&#39;)
print sys.getdefaultencoding() #utf-8


结合(1)和(2)做个试验:指定代码文件编码为utf-8时,用notepad++打开显示的是utf-8无DOM编码;未指定代码文件编码时,用notepad++打开显示的是ANSI编码(压缩编码,默认的保存编码形式)。

Python コーディングの概要 (エンコーディングの種類、形式、トランスコーディング)

(3)如何永久地将python默认采用的编码设置为utf-8呢?有2种方法:

第一个方法:编辑site.py,修改setencoding()函数,强制设置为 utf-8;

第二个方法:增加一个名为 sitecustomize.py的文件,存放在安装目录下的\Lib\site-packages目录下

sitecustomize.py是在site.py被import执行的,因为 sys.setdefaultencoding()是在site.py的结尾处被删除的,所以可以在 sitecustomize.py使用 sys.setdefaultencoding()。

2、python代码中的字符串如果被指定了编码,举个例子:str = u'中文',该字符串的编码被指定为unicode(即python的内部编码)。

(1)这里有个误区需要注意!假如在py文件中有如下代码:


stra = u"中"
print stra.encode("gbk")


按上面说的stra是unicode形式,直接encode称gbk编码应该没问题啊?但是实际执行时会报错“UnicodeEncodeError: 'gbk' codec can't encode character u'\xd6' in position 0: illegal multibyte sequence”。

原因在于:python解释器在导入python代码文件并执行时,会先查看文件头有没有编码声明(例如#coding:gbk等)。如果发现声明,会将文件中的字符串都先解释成unicode的形式(这里先用默认编码gbk(cp936)将stra解码成unicode编码'd6d0'后保存),之后执行stra.encode('gbk')时,由于stra已经是unicode编码且'd6d0'在gbk的编码范围内,所以编码不会出现错误;如果文件头没有编码声明,则不会进行上述过程中的解码操作(这里就直接使用stra的unicode编码'd6'),之后执行stra.encode('gbk')时,由于'd6'不在gbk的编码范围所以报错。

(2)为避免这种类型的错误,最好在代码文件头上声明编码,或者麻烦点每次使用setdefaultencoding()。

(3)总的来说就是unicode是python解释器的内码,所有代码文件在导入并执行时,python解释器会先将字符串使用你指定的编码形式解码成unicode,然后再进行各种操作。所以不管是对字符串的操作,还是正则表达式,还是读写文件等等最好都通过unicode来进行。

【python中其他编码】

文件系统的编码:sys.getfilesystemencoding()
终端的输入编码:sys.stdin.encoding
终端的输出编码:sys.stdout.encoding

更多Python コーディングの概要 (エンコーディングの種類、形式、トランスコーディング)相关文章请关注PHP中文网!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。