Python コーディングの概要 (エンコーディングの種類、形式、トランスコーディング)
この記事では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) を使用した結果は
例: strb = u"中" の場合、type(strb) を使用した結果は
tmp_str = 'tmp_str' print tmp_str.__class__ #<type 'str'> print type(tmp_str) #<type 'str'> print type(tmp_str).__name__ #str tmp_str = u'tmp_str' print tmp_str.__class__ #<type 'unicode'> print type(tmp_str) #<type 'unicode'> 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('http://www.php.cn') res_cont = res.read() res.close() print chardet.detect(res_cont) #{'confidence': 0.99, 'encoding': 'utf-8'}
detect 関数の戻り値は、2 つのキーと値のペアを含む辞書です。 2 つ目は、検出されたエンコード形式です。
(3) 方法2: コンテンツの一部を検出してエンコードを決定し、速度を向上させます
import urllib2 from chardet.universaldetector import UniversalDetector res = urllib2.urlopen('http://www.php.cn') 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 #{'confidence': 0.99, 'encoding': 'utf-8'}
【エンコードを変換】
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') を使用します。
デフォルトのパラメータは 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('utf-8') print sys.getdefaultencoding() #utf-8
结合(1)和(2)做个试验:指定代码文件编码为utf-8时,用notepad++打开显示的是utf-8无DOM编码;未指定代码文件编码时,用notepad++打开显示的是ANSI编码(压缩编码,默认的保存编码形式)。
(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中文网!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

Investing.comの反クラウリング戦略を理解する多くの人々は、Investing.com(https://cn.investing.com/news/latest-news)からのニュースデータをクロールしようとします。
