더북(TheBook)

하지만 유니코드 데이터를 UTF-8로 인코딩한 문자열에서는 이 코드가 작동하지 않는다.3

w = '寿' 
x = w.encode('utf-8')
y = x[::-1]
z = y.decode('utf-8')

>>>
Traceback ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in
position 0: invalid start byte

-1 말고 다른 음수 증가값이 유용할까? 다음 예제를 살펴보자.

x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
x[::2]   # ['a', 'c', 'e', 'g']
x[::-2]  # ['h', 'f', 'd', 'b']

여기서 ::2는 ‘시작부터 매 두 번째 원소를 선택한다’는 뜻이다. 또한, ::-2는 ‘끝에서 시작해 앞으로 가면서 매 두 번째 원소를 선택한다’는 뜻이다.

 

 


3 역주 유니코드 문자열과 유니코드 문자열을 utf-8로 인코딩한 바이트 문자열 사이의 차이를 명확히 아는 독자라면 여기에 표시된 오류가 전혀 이상하지 않을 것이다. utf-8 인코딩의 바이트 순서를 뒤집으면 원래 utf-8 인코딩 바이트 문자열 코드에서 2바이트 이상으로 이뤄졌던 문자들은 코드가 깨지기 때문에, 이 바이트 문자열을 유니코드 문자열로 디코딩할 수는 없다. 단, 모든 문자가 아스키 코드 범위에 들어가는 문자라면 아무 문제가 없을 수도 있다(utf-8 인코딩에서 아스키 코드에 해당하는 글자들은 모두 아스키 코드와 같은 1바이트 값으로 인코딩된다).

w = 'abcZYX123'
x = w.encode('utf-8')
y = x[::-1]
z = y.decode('utf-8')
print(z) 
        
>>>
'321XYZcba'
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.