하지만 유니코드 데이터를 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'