[Pythonは]あなたとスタックテスト開発は完全にのpython3符号理論を理解してください

[記事ポータル-todo]:前回の記事で、私たちは、符号化形式の歴史を紹介しました。今日はフォローするPythonスクリプトを書いた後コーディングする際に問題が発生したので、一度のpython3形式で休むように符号理論、いくつかの例があります。

のは、いくつかの概念をクリアしてみましょう:

  • システムのデフォルトのエンコーディングは:Pythonがない他の符号化フォーマットを宣言する場合、UTF-8フォーマットをエンコードするのpython3のデフォルトに、Pythonのインタープリターのデフォルトの符号化形式、ファイルヘッダを指します。
  • ローカルのデフォルトエンコーディング:オペレーティングシステムのデフォルトのエンコード、一般的なWindowsのデフォルトのエンコードはGBK、LinuxのデフォルトエンコーディングであるUTF-8です。
  • Pythonのファイルヘッダ宣言エンコーディング形式:修正形式のファイルをエンコードするデフォルトが、Pythonインタプリタパイソンの符号化フォーマットに影響を与えますが、ファイルを読み込み、システムのデフォルトのエンコーディングとローカルのデフォルトのエンコーディングを変更しません。

Pythonの独自のライブラリによって、あなたは、システムのデフォルトのエンコーディングとローカルのデフォルトのエンコーディングを表示することができます

Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>> import locale
>>> locale.getdefaultlocale()
('zh_CN', 'cp936')
>>>

コード・ページである。なお、私はコンピュータのWindowsシステムのテストに行っているため、システムのデフォルトエンコーディングリターン「CP936」、(文字コードセットが別名である)、および936は、対応するGBKです。あなたがLinuxやMac上で上記のコードを実行する場合は、UTF-8エンコーディングを返却する必要があります。

加算事実、歪みやすいシーンなど基本的に読み取りと書き込みの両方の手順:読み取り/ファイルを書き込む、またはプロセスが伴うため、ネットワーク等の流れからデータを読み出す符号化及び復号化のをこのプロセスは、長い符号化等のフォーマットをコードする対応しない復号として、文字化けすることが容易です。私たちは、あなたがプロセスを理解するためのpythonの下で符号理論を検証するための2つの具体的な例を与えるの下に。注:以下の実施例はでpycharmで書かれています。

01デフォルトのエンコード形式

Encode_demo.pyは、我々は(あなたが右下隅のpycharmからエンコード形式を見ることができます)新しいファイル、ファイルのデフォルトのエンコード形式はUTF-8で作成し、以下のように、コードは次のとおりです。

"""
    @author: asus
    @time: 2019/11/21
    @function: 验证编码格式
"""
import sys, locale


def write_str_default_encode():
    s = "我是一个str"
    print(s)
    print(type(s))
    print(sys.getdefaultencoding())
    print(locale.getdefaultlocale())

    with open("utf_file", "w", encoding="utf-8") as f:
        f.write(s)
    with open("gbk_file", "w", encoding="gbk") as f:
        f.write(s)
    with open("jis_file", "w", encoding="shift-jis") as f:
        f.write(s)


if __name__ == '__main__':
    write_str_default_encode()

デフォルトのエンコード形式はUTF-8であるので、我々は適切に文字列sを印刷して、ファイルを復号化するために、フォーマットをコードUTF-8を使用してデフォルトのPythonインタプリタを宣言していないためのは、結果を推測してみましょう。UTF-8エンコーディング形式のファイルで同時に書き込みで文字化けされず、ここで(ポイントをGBKとシフトJIS(日本語エンコーディング)書き込みファイルが文字化けして、私は直接pycharmを生成したビューファイルを開いている、デフォルトのエディタエンコードはUTF-8は、システムのデフォルトのエンコーディングは、Windows、gbk_fileにGBKのですutf_fileは、我々は、実行の結果を見て)のみjis_file文字化けしている、文字化けされることはありません、以下の場合に、開くメモ帳を使用しています:

# 运行结果
我是一个str
<class 'str'>
utf-8
('zh_CN', 'cp936')

# 写文件utf_file、gbk_file、jis_file文件内容分别是:
我是一个str
����һ��str
�䐥�꘢str

そして、我々は推測一貫した結果は、の結果で変更、ファイルヘッダ内のステートメントのエンコード形式、表情を作ってみよう。

02 Pythonのヘッダファイルは、符号化フォーマットを宣言する

上記encode_demo.pyファイル形式のUTF-8であるので、我々はGBKエンコーディングにそれを向けるだろう。Pythonインタプリタは、GBKに行く間、同じLETの結果で推測を取る、pycharmで、文のpythonファイルのヘッダーに、GBKにフォーマットのファイルをエンコードする、GBK(ヘッドプラス= GBKをコーディング#)としてエンコードされた後、 encode_demo.pyファイルを復号化し、その結果は、それをコードUTF-8で実行する必要があります。結果は以下の通りであります:

# 运行结果
我是一个str
<class 'str'>
utf-8
('zh_CN', 'cp936')

# 写文件utf_file、gbk_file、jis_file文件内容分别是:
我是一个str
����һ��str
�䐥�꘢str

実際、結果は同じで、私たちは正しいことを証明する推論します。次に、我々は(#コーディング= GBK)pycharm#で= GBKをコーディングすることを削除(注削除され、エンコード形式のファイルを変更しない、そのencode_demo.pyまたはGBKがコーディングならば、我々は、あることをしてみてください)、我々は結果を確認するために、再度、それを実行します。

  File "D:/codespace/python/pythonObject/pythonSample/basic/encodeDemo/encode_demo.py", line 4
SyntaxError: Non-UTF-8 code starting with '\xd1' in file D:/codespace/python/pythonObject/pythonSample/basic/encodeDemo/encode_demo.py on line 5, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

直接実行エラー、我々は、ブレークポイント、特定の例外情報を見て追加します。

コーディングエラーを.PNG

エラーメッセージがencode_demo.pyファイルは、デフォルトのUTF-8エンコーディングを使用して、デコードUnicodeDecodeError、Pythonインタプリタであるが、ファイル自体はGBKのエンコーディングで、ヒットときに中国を特定する方法はありませんを参照してください、DecodeErrorをスローします。

03ノック黒板、フォーカスを描きます

STRとバイト単位でのpython3

一つの重要な特徴はのpython3の文字列で、バイナリストリームは厳密に区別を行い、我々は、文字列の型はSTRであるが、相互に変換することができ筋力とバイト宣言します。

def str_transfor_bytes():
    s = '我是一个测试Str'
    print(type(s))
    # str 转bytes
    b = s.encode()
    print(b)
    print(type(b))
    # bytes转str
    c = b.decode('utf-8')
    print(c)
    print(type(c))


if __name__ == '__main__':
    str_transfor_bytes()

ノートへのポイント:あなたがエンコード()とデコード()メソッドを呼び出すときにパラメータを渡さない場合、Pythonインタプリタは、デフォルトのエンコード形式UTF-8(そうでない場合はPythonのヘッダファイルエンコード宣言する形式)を使用します。しかし、パラメータ渡した場合、次いで、対応を使用できるように符号化フォーマットをエンコード及びデコードします。

python3のデフォルトのエンコーディングはUTF-8ですか?またはUnicodeの?

多くの場合、我々は多くの記事を見て、のpython3デフォルトのエンコード形式はUnicodeですが、私はこの記事のpython3デフォルトのエンコード形式で言っている正しいどのステートメントその後、UTF-8のですか?実際には、2つのステートメントは、右、UnicodeとUTF-8(前述の記事)との主な違いを見つけるために持っています:

  • ユニコード文字セットは、それが全て一体化されている各種コード間の関係をマッピングする手段であるが、それは、メモリ空間が占有表現するために2バイトまたは4バイトの全て、長い不変であり、比較的大きいです。
  • UnicodeのUTF-8が容易なストレージとネットワーク伝送のために、Unicodeコードに変換するメインデータの実装です。このような英語のアルファベットとして、それは1つのバイトを使用して表すことができ、可変長符号化です。

PythonのPythonインタプリタがデフォルトのUTF-8エンコーディングを使用してファイルを解析する際にメモリで使用されるすべての文字列は、のpython3 Unicodeコードです。

open()メソッドは、現在のローカル符号化を使用します

上記の例では、我々はファイルをディスクに書き込むとき、エンコード形式を指定します。あなたがエンコード形式を指定しない場合、デフォルトのオペレーティングシステムは、ローカルのデフォルトのエンコード形式を使用します、のような:LinuxのデフォルトはUTF-8で、WindowsのデフォルトはGBKです。相互作用およびディスクは、オペレーティングシステムのエンコーディング形式を検討することを確認しているため実際には、理解することが良いです。この区別エンコード()とデコード()デフォルトのエンコード形式のPythonインタプリタを使用するには、混乱しないでください。

概要

あなたは、コーディング理論のpython3を完全に理解するかどうか、上記の例を読んだ後に知りません。しかし、コーディングの問題のすべては、あなたがエンコード問題が発生したとき、「コード」と「デコード」プロセスを逃れることができない、最初に、一致する限り、一般的に必要なエンコード形式を決定し、その後、ソースファイル、オブジェクトファイルとで使用されるエンコーディングを決定あなたは、コーディングの問題を解決することができます。

おすすめ

転載: www.cnblogs.com/zhouliweiblog/p/11909554.html