104

私はpython2から来たpython3が初めてで、ユニコードの基礎と少し混乱しています。私はいくつかの良い投稿を読んだので、すべてがより明確になりましたが、Python 3にはエンコードとデコードを処理する2つのメソッドがあり、どちらを使用すればよいかわかりません。

したがって、python 3 の考え方は、すべての文字列が Unicode であり、エンコードしてバイト単位で格納したり、再び Unicode 文字列にデコードしたりできるということです。

しかし、それを行うには 2 つの方法があり
u'something'.encode('utf-8')ます。 と同じことをしているようです。b'something'bytes(u'something', 'utf-8')
b'bytes'.decode('utf-8')str(b'bytes', 'utf-8')

今私の質問は、同じことをしているように見える2つの方法があり、他の方法よりも優れているのはなぜですか(そしてなぜですか?)私はグーグルでこれに対する答えを見つけようとしましたが、運がありません.

>>> original = '27岁少妇生孩子后变老'
>>> type(original)
<class 'str'>
>>> encoded = original.encode('utf-8')
>>> print(encoded)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded)
<class 'bytes'>
>>> encoded2 = bytes(original, 'utf-8')
>>> print(encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded2)
<class 'bytes'>
>>> print(encoded+encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x8127\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> decoded = encoded.decode('utf-8')
>>> print(decoded)
27岁少妇生孩子后变老
>>> decoded2 = str(encoded2, 'utf-8')
>>> print(decoded2)
27岁少妇生孩子后变老
>>> type(decoded)
<class 'str'>
>>> type(decoded2)
<class 'str'>
>>> print(str(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81', 'utf-8'))
27岁少妇生孩子后变老
>>> print(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'.decode('utf-8'))
27岁少妇生孩子后变老
4

3 に答える 3

67

Neither is better than the other, they do exactly the same thing. However, using .encode() and .decode() is the more common way to do it. It is also compatible with Python 2.

于 2013-01-23T06:09:07.237 に答える
18

Lennart Regebro の回答に追加するには、使用できる 3 番目の方法もあります。

encoded3 = str.encode(original, 'utf-8')
print(encoded3)

とにかく、実際には最初のアプローチとまったく同じです。また、2 番目の方法は 3 番目のアプローチの構文糖衣のようにも見えるかもしれません。


プログラミング言語は、機械によって実行される抽象的なアイデアを形式的に表現する手段です。プログラミング言語は、必要な構造が含まれている場合に優れていると見なされます。Python はハイブリッド言語です。つまり、純粋なオブジェクト指向言語や純粋な手続き型言語よりも自然で用途が広い言語です。オブジェクトメソッドよりも関数の方が適切な場合もあれば、その逆の場合もあります。それは、解決された問題のイメージに依存します。

とにかく、質問で言及されている機能は、おそらく言語の実装/設計の副産物です。私の意見では、これは技術的に同じことについて別の考え方を示す良い例です。

つまり、オブジェクトメソッドを呼び出すということは、「オブジェクトが私に望む結果を与えてくれるようにする」という言葉で考えることを意味します。代替手段として関数を呼び出すことは、「外部コードが渡された引数を処理し、必要な値を抽出する」ことを意味します。

最初のアプローチは、オブジェクトが独自にタスクを実行する能力を強調し、2 番目のアプローチは、データを抽出する別のアルゴリズムの能力を強調します。場合によっては、個別のコードが非常に特殊なため、オブジェクトのクラスに一般的なメソッドとして追加するのは賢明ではない場合があります。

于 2013-01-23T07:59:29.743 に答える