Python 3 - 인코딩/디코드 대 바이트/스트론
저는 python2에서 온 python3가 처음이고 유니코드 기본 원리에 약간 혼란스럽습니다.저는 좋은 게시물들을 읽었고, 그것이 그것을 훨씬 더 명확하게 만들었습니다. 하지만 저는 파이썬 3에 인코딩과 디코딩을 처리하는 두 가지 방법이 있다는 것을 보았고, 어떤 것을 사용해야 할지 모르겠습니다.
그래서 python 3의 아이디어는 모든 문자열이 유니코드이며 인코딩되어 바이트로 저장되거나 다시 유니코드 문자열로 디코딩될 수 있다는 것입니다.
하지만 두 가지 방법이 있습니다.
u'something'.encode('utf-8')
생성됩니다.b'something'
그러나 그것도 마찬가지입니다.bytes(u'something', 'utf-8')
.
그리고.b'bytes'.decode('utf-8')
와 같은 일을 하는 것 같습니다.str(b'bytes', 'utf-8')
.
이제 제 질문은, 왜 같은 일을 하는 것처럼 보이는 두 가지 방법이 있고, 다른 방법보다 더 나은 방법이 있는가 하는 것입니다(그리고 그 이유는 무엇인가요?).구글에서 이에 대한 답을 찾으려 했지만, 운이 없었습니다.
>>> 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와도 호환됩니다.
레나트 레게브로의 답변에 추가하기 심지어 사용할 수 있는 세 번째 방법이 있습니다.
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
'source' 카테고리의 다른 글
스택 패널의 패딩? (0) | 2023.05.17 |
---|---|
Xcode에서 빌드 타이밍을 활성화하는 방법은 무엇입니까? (0) | 2023.05.17 |
Postgre 작성SQL ROLE(사용자)(존재하지 않는 경우) (0) | 2023.05.17 |
단일 쿼리에서 mongo에서 여러 문서 제거 (0) | 2023.05.17 |
ASP.NET의 세션 시간 초과 (0) | 2023.05.17 |