Programing

Python 3-인코딩 / 디코딩 대 바이트 / Str

crosscheck 2020. 10. 25. 11:37
반응형

Python 3-인코딩 / 디코딩 대 바이트 / Str


나는 python2에서 온 python3을 처음 접했고 유니 코드 기본 사항과 약간 혼란 스럽습니다. 나는 그것을 훨씬 더 명확하게 만든 몇 가지 좋은 게시물을 읽었지만 파이썬 3에는 인코딩과 디코딩을 처리하는 두 가지 방법이 있으며 어떤 방법을 사용 해야할지 모르겠습니다.

그래서 파이썬 3의 아이디어는 모든 문자열이 유니 코드이고 인코딩되고 바이트로 저장되거나 다시 유니 코드 문자열로 디코딩 될 수 있다는 것입니다.

그러나이 그것을하는 2 가지 방법 :
u'something'.encode('utf-8')생성은 b'bytes'하지만, 그렇게 bytes(u'something', 'utf-8').
그리고 b'bytes'.decode('utf-8')같은 일을 할 것으로 보인다 str(b'', 'utf-8').

이제 내 질문은 왜 같은 일을하는 것처럼 보이는 두 가지 방법이 있으며 다른 것보다 낫습니다 (그리고 왜?) Google에서 이에 대한 답을 찾으려고했지만 운이 없습니다.

>>> 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岁少妇生孩子后变老

둘 다 다른 것보다 낫지 않고 정확히 같은 일을합니다. 그러나, 사용 .encode()하고 .decode()그것을하는 일반적인 방법입니다. Python 2 와도 호환됩니다.


Lennart Regebro의 답변에 추가하려면 사용할 수있는 세 번째 방법도 있습니다.

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

어쨌든 그것은 실제로 첫 번째 접근 방식과 정확히 동일합니다. 두 번째 방법은 세 번째 접근 방식에 대한 통사론 적 설탕 인 것처럼 보일 수도 있습니다.


프로그래밍 언어는 기계에 의해 실행될 추상적 인 아이디어를 공식적으로 표현하는 수단입니다. 프로그래밍 언어는 필요한 구조를 포함하면 좋은 것으로 간주됩니다. Python은 하이브리드 언어입니다. 즉, 순수한 OO 또는 순수한 절차 적 언어보다 더 자연스럽고 다재다능합니다. 때로는 함수가 객체 메서드보다 더 적절하고 때로는 그 반대가 사실입니다. 해결 된 문제의 정신적 그림에 달려 있습니다.

어쨌든 질문에 언급 된 기능은 아마도 언어 구현 / 설계의 부산물 일 것입니다. 제 생각에 이것은 기술적으로 같은 것에 대한 대안 적 사고를 보여주는 좋은 예입니다.

즉, 객체 메서드를 호출한다는 것은 "객체가 원하는 결과를 제공하도록 허용" 이라는 용어로 생각하는 것을 의미 합니다 . 대안으로 함수를 호출한다는 것은 "외부 코드가 전달 된 인수를 처리하고 원하는 값을 추출하도록하는 것"을 의미 합니다.

첫 번째 접근 방식은 객체가 자체적으로 작업을 수행하는 능력을 강조하고 두 번째 접근 방식은 데이터를 추출하는 별도의 알고리즘의 능력을 강조합니다. 때로는 별도의 코드가 너무 특별해서 객체의 클래스에 일반 메서드로 추가하는 것이 현명하지 않을 수 있습니다.


이전 답변에 추가하기 위해 사용할 수있는 네 번째 방법도 있습니다.

import codecs
encoded4 = codecs.encode(original, 'utf-8')
print(encoded4)

참고 URL : https://stackoverflow.com/questions/14472650/python-3-encode-decode-vs-bytes-str

반응형