>>> a = b'h\x65llo'
>>> a
b'hello'
>>> print(list(a))
[104, 101, 108, 108, 111]
>>> print(a)
b'hello'
사람이 사용하는 언어의 문자를 표현하는 유니코드 코드 포인트(code point)
>>> a = 'a\u0300 propos'
>>> a
'à propos'
>>> a
'à propos'
>>> print(list(a))
['a', '̀', ' ', 'p', 'r', 'o', 'p', 'o', 's']
>>> print(a)
à propos
유니코드 샌드위치 (Unicode Sandwich)"는 Python 3를 비롯한 여러 언어/환경에서 문자열 처리의 일관성을 유지하기 위한 전략이다. 텍스트 인코딩 문제를 피하기 위한 좋은 컨벤션이다.
파이썬 프로그래밍을 작성할 때 유니코드 데이터를 인코딩하거나 디코딩하는 부분을 인터페이스의 가장 먼 경계 지점에 위치시키는 것
str
을 사용해야 하고, 문자 인코딩에 대해 어떠한 가정도 해서는 안 된다.Latin-1
, Shift
, JIS
, euc-kr
, cp949
, Big5
등)으로 입력 데이터를 받아들일 수 있다.UTF-8
이 이상적)로 엄격히 제한할 수 있다.def to_str(bytes_or_str) -> str:
if isinstance(bytes_or_str, bytes):
value = bytes_or_str.decode('utf-8')
else:
value = bytes_or_str
return value
print(repr(to_str(b'foo'))) # 'foo'
print(repr(to_str('bar'))) # 'bar'
print(repr(to_str(b'\xed\x95\x9c'))) # '한'
def to_bytes(bytes_or_str) -> bytes:
if isinstance(bytes_or_str, str):
value = bytes_or_str.encode('utf-8')
else:
value = bytes_or_str
return value
print(repr(to_bytes(b'foo'))) # b'foo'
print(repr(to_bytes('bar'))) # b'bar'
print(repr(to_bytes('한글'))) # b'\xed\x95\x9c\xea\xb8\x80'
이진 8비트 값과 유니코드 문자열을 파이썬에서 다룰 때 꼭 기억해야 할 두가지가 있다.
print(b'foo' + b'bar') # b'foobar'
print('boo' + 'bar') # foobar
그러나
print('foo' + b'bar')
print('foo' + b'bar')
~~~~~~^~~~~~~~
TypeError: can only concatenate str (not "bytes") to str
마찬가지로,
print(b'foo' + 'bar')
print(b'foo' + 'bar')
~~~~~~~^~~~~~~
TypeError: can't concat str to bytes