В вашем первом фрагменте вызов unicode(requestHandler.read())
говорит Python преобразовать строку байтов, возвращаемую read
в unicode
: так как для преобразования не указан код, ascii
проверяется (и не выполняется). Он никогда не доходит до того, что вы собираетесь вызывать .decode
(что в любом случае не имеет смысла вызывать этот юникод-объект).
Либо используйте unicode(requestHandler.read(), 'utf-8')
, или requestHandler.read().decode('utf-8')
: любой из них должен создать правильный объект Unicode , если кодировка действительно utf-8
(наличие этого D0
байт предполагает, что это может быть не так, но невозможно угадать, если из контекста показывать один не-ascii символ).
print
ing Данные Unicode - это другая проблема, для которой требуется хорошо сконфигурированный и совместимый эмулятор терминала - тот, который позволяет Python устанавливать sys.stdout.encoding
при запуске. Например, на Mac, используя терминал Apple. Приложение :
>>> sys.stdout.encoding
'UTF-8'
, поэтому печать объектов Unicode работает нормально:
>>> print u'\xabutf8\xbb'
«utf8»
как и печать байтовых строк в кодировке utf8:
>>> print u'\xabutf8\xbb'.encode('utf8')
«utf8»
но на других машинах будет работать только последняя (используя собственную кодировку эмулятора терминала, которую вам нужно выяснить самостоятельно, потому что эмулятор терминала не говорит Python; -).