python2.7字符编码:首先decode('utf-8)然后保存的时候又encode('utf-8)有没有必要?
黄舟
黄舟 2017-04-18 09:46:54
0
7
602

想请教一下python2.7下字符编码的两个问题。

  1. python2.7爬虫爬取一个utf-8的中文网页,为了对防止乱码首先decode('utf-8')转化为unicode。然后如果将这些unicode编码的内容保存到文件的时候有调用encode('utf-8')以utf-8编码保存有没有必要?

# -*-coding:utf-8 -*-的作用是不是保存当前.py文件为utf-8编码?
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信 (7)
洪涛

1. 必須

decode('utf-8') の機能は、utf8 でエンコードされた文字列を Unicode にデコードすることであり、Unicode は Python で最も受け入れられている文字エンコーディング形式です。これにより、文字エンコーディングの処理が不十分であるために問題が発生することはありません。さまざまなツールライブラリについて質問します。

2.はい

coding:utf-8 は、現在の Python コード ファイル内のすべての文字列のエンコーディングを指定するために使用されます

いいねを押す+0
    迷茫

    1. 必要ありません。 Web ページを保存し、response.read() で取得したバイト オブジェクトをバイナリ モードでファイルに書き込むだけです。

    2. はい。

    いいねを押す+0
      小葫芦

      1. Python2を使用する場合は必須ではありませんが、必要です。 Unicode はメモリ内にのみ存在できます。ファイルに保存する場合は、utf-8 または gbk などでエンコードする必要があります。そうしないと、必ずエラーが報告されます。

      1. はい、宣言されていない場合、デフォルトの形式は Ascii であるため、ファイルに中国語の文字が含まれる場合は、中国語のコメントなどのエラーが報告されます

      いいねを押す+0
        PHPzhong

        Python 3 バージョンでは、デフォルトのエンコード形式 ASCII が変更されました

        いいねを押す+0
          刘奇

          文字列エンコーディングに関する Liao Xuefeng のチュートリアル「文字列とエンコーディング」を参照することをお勧めします。 これを読むと、utf-8 と unicode の関係がわかります。

          いいねを押す+0
            大家讲道理
            1. ファイルを保存するときに utf-8 にエンコードする必要がありますか

              どちらも可能ですが、どちらのエンコーディングでファイルを保存するか、そしてどのエンコーディングが後続の処理に便利かによって決まります。
              ただし、Unicode 文字列を記述する場合は、codes.open を使用してファイルを開いてエンコードを設定するのが最善です。

            2. ソースコードのエンコード定義の役割(# --coding:utf-8 --)

              コード ファイルをデコードする方法を Python コンパイラーに指示しますが、ファイルの実際のエンコードがそれと一致することは保証されません。
              実際のファイルのエンコーディングは依然としてエディターによって決定されます (一部のエディターは # --coding:utf-8 -- を認識し、対応するエンコーディングで保存する場合があります)。

              たとえば、私の vim のファイルエンコーディングは utf-8 に設定されていますが、py ファイルのエンコーディングは ascii (--coding:ascii --) に設定されています。
              現時点では、py ファイルの実際のエンコーディングは utf-8 ですが、Python コンパイラーは非 ASCII 文字に遭遇すると、ソース ファイルを解析します。
              SyntaxError です。 : 'ascii' コーデックは位置 5 のバイト 0xe4 をデコードできません: 序数が範囲 (128) にありません

            いいねを押す+0
              PHPzhong

              Unicode と utf-8 の関係

              Unicode は文字セットです

              • 文字セットは、からまでの各文字に対応する数字のセットです。たとえば、Unicode の A は 0041 に対応し、漢字の「I」は '6211'

              • unicode は、世界中のほぼすべての文字をカバーする大規模なコレクションであり、現在のサイズは 100 万文字を収容できます。

              utf-8 は Unicode ストレージの実装です

              Unicode は文字に対応する数値のみを定義しますが、これらの数値をどのように格納するかについては規定していません。たとえば、中国語の文字「I」を表すには 2 バイトが必要ですが、英語の文字「A」はその他の文字を 1 バイトだけ必要とします。 3 ~ 4 バイトが必要になる場合があります。

              • 各文字を 3 バイトまたは 4 バイトで保存するように一律に規定されている場合、英語の各文字には必然的に 2 ~ 3 個の追加のゼロが必要となり、ストレージが大幅に無駄になります。

              • 各文字が実際に必要なバイト数に従って格納されている場合、コンピューターは 3 バイトが 3 文字を表すか 1 文字を表すかを判断できません。

              utf-8 は、utf-16 および utf-32 と同様に、Unicode エンコード ストレージの実装です。

              utf-8 は最も広く使用されているエンコード方式で、可変長エンコードを使用し、文字を表すのに 1 ~ 4 バイトを使用します。utf-16 は 2 バイトまたは 4 バイトを使用し、utf-32 は 4 バイトで表されます。エンコード規則は次のとおりです:

              1. シングルバイトシンボルの場合、バイトの最初のビットは 0 に設定され、次の 7 ビットはこのシンボルの Unicode コードです。したがって、英語の文字の場合、UTF-8 エンコードと ASCII エンコードは同じです。

              2. n バイトのシンボル (n>1) の場合、最初のバイトの最初の n ビットは 1 に設定され、n+1 番目のビットは 0 に設定され、後続のバイトの最初の 2 ビットはに設定されるのは 10 です。言及されていない残りの 2 進ビットはすべて、このシンボルの Unicode コードです。

              Python2 の str と unicode

              python2 には、

              byte string (str)という 2 つの文字列型があります。unicode string (unicode)リーリー

              上記の出力では、最初の s の型は str で、出力されるコンテンツは utf-8 でエンコードされたコンテンツです。 2 番目の s の型は Unicode で、出力される 2 つの全角数字はそれぞれ 2 つの漢字「美的」を表します。

              encodeは、str 型と Unicode 型の間の変換を提供します。decode

              • encode は Unicode を str(バイト文字列) に変換します

              • decode は str(バイト文字列) を Unicode に変換します

              基本的に、str はストレージのバイト順序であり、ascii、gbk、utf-8 などのいずれかになります。これらは、decode を呼び出すことで Unicode に変換できます。デフォルトのデコード エンコーディングは ascii です。 str でどのエンコーディングが使用されるかは、それが配置されているシーンによって異なり、ロケール、ファイル エンコーディングなどに関連します。

              テキストファイルとエディタの処理

              リーリー

              たとえば、上記のファイルenc.pyを保存する場合、GBK となるように文件编码を選択します。 プログラム ファイルは、外部アプリケーション (エディターや Python インタープリターなど) を使用して開く場合、基本的にファイルです。 external アプリケーションはファイルのエンコード形式を認識しません、

              現時点では 3 つの状況があります:

              • アプリケーションは解析にデフォルトのエンコード方式 (UTF-8 や ASCII など) を使用します。Python インタープリターのデフォルトは ASCII であり、エディターはそれを独自に設定できます。

              • アプリケーションは、ファイル内のバイト内容に基づいてエンコード方式を自動的に検出します。
              • テキスト ファイルは、デコードに使用するエンコード方式をアプリケーションに指示します。たとえば、

                は、デコードに GBK を使用するようにインタプリタに指示します。
              • 試して、

                を削除して# -*- coding: GBK -*-を実行すると、出力:

                リーリー
              • vim でファイルを開こうとすると、vim のデフォルトのファイルエンコーディングが UTF-8 に設定されているため、「中国語」という単語が文字化けして表示されます。
              リーリー

              出力結果:# -*- coding: GBK -*-リーリーpython enc.pyここから、s2 がファイルから読み取った GBK エンコードされたコンテンツをバイト形式で保存していることがわかります。

              以下のコードを見てください。プログラム ファイル

              は UTF-8 エンコードで保存されています。

              リーリー

              出力:

              リーリー

              s2 に格納されているのは保存されたファイルの UTF-8 バイトコードであることもここでわかります。

              utf8_enc.py参考文献

              http://www.rrn.dk/the-differ...

              http://www.ruanyifeng.com/blo...

              https://docs.python.org/2 /どのように...

              http://yergler.net/2012/bytes...

              いいねを押す+0
                最新のダウンロード
                詳細>
                ウェブエフェクト
                公式サイト
                サイト素材
                フロントエンドテンプレート
                私たちについて 免責事項 Sitemap
                PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!