..
Byte 와 str 의 차이
- 시퀀스 란?
- 문자열 , 수열 등 특정 데이터가 열거되어있는 자료형을 시퀀스 라고 한다.
- 파이썬의 문자열 시퀀스에는 Bytes 타입 과 Str 타입이 있다.
-
Byte
Byte 문자열에는 부호가 없는 8바이트 데이터가 그대로 들어간다.
a = b'h\x65llo' print (list(a)) print (a) >>> [104,101,108,108,111] b'hello'
-
Str
str 인스턴스에는 사람이 사용하는 언어의 문자를 표현하는 유니코드 codPoint 가 들어있다.
a = 'a\u0300 propos' print (a) >>> à propos
! 중요한점
- 여기서 str 과 bytes 서로 대응하는 인코딩이 없다
때문에 str 에서 bytes 로 변환 할때 `str 의 encode 메소드` 를 호출해야하고 bytes 에서 str 로 변환할때 `bytes 의 decode 메소드` 를 호출해야한다. 그래서 내가 원하는 방식으로 인코딩 방식을 명시적으로 지정 할수 도 있고 시스템 디폴트 인코딩을 받아들일수도 있다. (일반적으로는 UTF-8 이 시스템 디폴트 인코딩 이지만 항상 UTF-8 이 디폴트 인것은 아니다.)
-
Encode & Decode
- 파이썬 프로그램 을 작성할 때 유니코드 데이터를 인코딩 하거나 디코딩 하는 부분을 인터페이스의 가장 먼 경계 부분에 위치시켜라.
- 유니코드 데이터가 들어있는 str 을 사용해야하며 , 어떠한 가정도 하면 안된다.
-
이런 접근 방식을 사용하게 된다면 다양한 텍스트 인코딩을 input 받을수 있고, 출력 테스트 인코딩은 한가지로 제한될 수 있다.
- 문자를 표현하는 타입이 둘로 나눠져 있기 때문에 파이썬 코드를 작성할때 두가지 상황이 자주 발생한다.
- UTF-8(예시) 로 인코딩된 8비트 시퀀스를 그대로 사용하고 싶다.
- 특정 인코딩을 지정하지 않은 유니코드 문자열을 사용하고 싶다.
두가지 상황중 일치하는 값을 확신하기 위해 도우미 함수가 필요할때가 있다.
def to_str(bytes_or_str): if isinstance(bytes_or_str,bytes): value = bytes_or_str.decode('utf-8') else: value = bytes_or_str return value # str 인스턴스 print(repr(to_str(b'foo'))) print(repr(to_str('bar'))) print(repr(to_str(b'\xed\x95\x9c'))) >>> 'foo' 'bar' '한'
! 꼭 기억해야할 문제점
- bytes 와 str 은 같은 타입끼리는 비교나 연산이 되지만, 서로 다르면 비교,연산 이 되지 않는다.
- 마찬가지로 형식화 문자열 (%) 도 같은 타입끼리만 된다.
- 파일 핸들링 관련 연산들이 디폴트로 유니코드 문자열을 요구하고 이진바이트 문자열은 요구하지 않는것
- 이는 파일을 열때 w, r 등이 아닌 wb , rb 등 이진 모드를 통해 파일을 열면 해결된다.
- open 함수의 encoding 파라미터를 명시하면 플랫폼에 따라 동작이 달라질 일이 없어진다.
-