python 3のunicodeとbytesの問題を深く分析します。


最近いくつかのpython 3のプログラムを書いて、至るところbytesタイプを見ることができて、それはpython 2の中に存在しないで、これもpython 3とpython 2の著しい違いの1つです。
以前はpython 2のコードを書く時、多くの符号化エラーが発生しました。原因はpython 2対unicodeのサポートが特に理想的ではないからです。python 3では、すべての作成コードはunicodeであり、python解像度は実行時に内部変換(bytesタイプと定義されている場合を除いて)がunicodeとなり、エラーの可能性が減少しました。
python 3には、デフォルトではstr、すなわちunicode、テキストタイプという2種類の文字列があります。しかし、プログラムは常にI/O操作(ディスク、ネットワーク)、すなわちI/Oバイナリデータがあり、python 3ではbytesタイプと定義されています。bytesタイプは、1つのバイト列で、0〜256の間の1つの整数が含まれています。
bytesタイプはどのように定義されますか?2つの表示方法があります。例えば、

#    ASCII 
x=b'abc'
y=b'\xe6\x88\x91'
print (x,y)
# unicode         
t=bytes("  ","UTF-8")
#  b'\xe6\x88\x91\xe4\xbb\xac'
#      ,UTF-8        
print (t)
#  6,  python  ,         
print (len(t))
#  2,      
print (len("  "))

次に、strタイプとbytesタイプの切り替えを話します。例えば、インターネットからバイナリデータを読み込んだ後、pythonはあなたの表示するものをstrタイプに変換する必要があります。つまり、pythonはstrとbytesの間で暗黙的に変換することはできません。面倒くさいように見えますが、間違えた確率を減らして、自分でやりたいことを明確にします。
strをbytesに変換するには、コードを選択し、バイナリデータがどのように符号化されているかを明確にしなければなりません。

x=" "
y=x.encode("UTF-8")
z=x.encode("GBK")
#b'\xe6\x88\x91' b'\xce\xd2'
print (y,z)
bytesをstrに変換するには、コードも必要です。説明しなければならないのは、バイナリデータのコードは何かを知っていなければなりません。もし選択が間違ったら、unicodeに変換する時はエラーが発生します。またpythonの内部では、バイナリデータがどんなコードであるかに関心がありません。bytesタイプであれば、バイトのシーケンスです。

x=b'\xe6\x88\x91'
print (x.decode("UTF-8"))
#   
print (x.decode("GBK"))
つまり、「python内部ではunicodeを使用しています。外部ではbytesタイプを使用しています。」というように、python内のライブラリでは、多くの関数が、strタイプかそれともbytesタイプかを説明します。

hmac.new(key, msg=None, digestmod=None) key is a bytes or bytearray object giving the secret key
多くの倉庫、特に第三方倉庫(例えば、requests)はpython 2とpythone 3の互換性のために内部で多くの変換作業をしています。bytesタイプの存在を認識させられません。生産力は向上しましたが、pythonを理解するにはあまり大きなメリットはありません。
bytesとstrの応用を十分に理解するためには、openとwriteの2つのビルド関数を参照することができます。
文書でファイルを開くと、pythonは内部で自動的にstrタイプに変換されます。

file ="t.txt"
t = open(file,mode="r").read()
バイナリ方式で開く場合、端末に表示するには、strタイプに変換する必要があります。

file ="t.txt"
t = open(file,mode="rb").read()
print (t.decode())
print (t,type(t))
バイナリ方式の書き込みであれば、bytesタイプのデータを直接書き込みます。

file="t.txt"
t=open(file,mode="wb")
t.write(b'\xe6\x88\x91')
上記のいくつかの例では、そのような符号化を使用することは説明されていません。指定が表示されない場合、一般符号化はlocale.getpreferedencoding() と同じです。
締め括りをつける
以上は小编が绍介したpython 3のunicodeとbytesの问题です。皆さんに助けてほしいです。もし何か疑问がありましたら、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。
本文があなたのためになると思ったら、転載を歓迎します。出所を明記してください。ありがとうございます。