항상 유니 코드에서 바이트로 인코딩 합니다.
이 방향으로 인코딩을 선택하게 됩니다.
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
다른 방법은 바이트에서 유니 코드로 디코딩하는 것입니다.
이 방향 에서 인코딩이 무엇인지 알아야합니다 .
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
이 점은 충분히 강조 할 수 없습니다. 유니 코드 "두더지 잡기"를하지 않으려면 데이터 수준에서 무슨 일이 일어나고 있는지 이해하는 것이 중요합니다. 여기에서는 다른 방법으로 설명합니다.
- 유니 코드 객체는 이미 디코딩되어 있으므로 절대 호출하고 싶지 않습니다
decode
.
- 바이트 문자열 객체는 이미 인코딩되어 있으므로 호출하고 싶지 않습니다
encode
.
이제 .encode
바이트 문자열 을 볼 때 Python 2는 먼저 암시 적으로 텍스트 ( unicode
객체) 로 변환하려고합니다 . 마찬가지로, .decode
유니 코드 문자열을 보면 Python 2는 암시 적으로이를 바이트 ( str
객체) 로 변환하려고합니다 .
이러한 암시 적 변환 은를 호출했을 때 얻을 수있는 이유 입니다. 인코딩은 일반적으로 유형의 매개 변수를 허용하기 때문입니다 . 매개 변수를 수신 할 때 다른 인코딩으로 다시 인코딩하기 전에 유형의 객체에 대한 암시 적 디코딩이 있습니다. 이 변환은 기본 'ascii'디코더 †를 선택 하여 인코더 내부의 디코딩 오류를 제공합니다.Unicode
Decode
Error
encode
unicode
str
unicode
사실, 파이썬 3 방법에 str.decode
및 bytes.encode
도 존재하지 않는다. 이들의 제거는 이러한 일반적인 혼란을 피하기위한 [논란의 여지가있는] 시도였습니다.
† ... 또는 코딩이 sys.getdefaultencoding()
언급하는 모든 것; 보통 이것은 'ascii'입니다.