Это работает, потому что вы декодируете байты в юникод:
'\xc4\xe3\xba\xc3'.decode('gbk')
Это не так, потому что вы пытаетесь кодировать байты (которые уже закодированы):
'\xc4\xe3\xba\xc3'.encode('gbk')
Сообщение об ошибке в Python 2 здесь бесполезно, но вы должны использовать кодирование только для строк Unicode:
u'\u4f60\u597d'.encode('gbk') # Gets you back the bytes you had before.
В Python 2 простое выполнение a
в интерактивной подсказке покажет не-ascii символы в экранированных строках (например, \xc3
или \u4f60
). Вы можете сделать print a
для отображения символов. Или используйте Python 3, который будет отображать строки, включая символы Юникода.