Прежде всего, вы декодируете данные в Unicode ( отсутствие кодирования) при чтении из файла, канала, сокета, терминала и т. Д .; и кодировать Unicode в соответствующую байтовую кодировку при отправке / сохранении данных. Я подозреваю, что это корень вашей проблемы.
Веб-сервис должен объявить кодировку в заголовках или полученных данных. print
обычно автоматически кодирует Unicode в кодировку терминала (обнаруживается через sys.stdout.encoding
) или при отсутствии этого просто ascii
. Если символы в ваших данных не поддерживаются целевой кодировкой, вы получите UnicodeEncodeError
.
Поскольку это не та ошибка, которую вы получили, вы должны опубликовать некоторый код, чтобы мы могли видеть, что вы делаете. Скорее всего, вы кодируете байтовую строку вместо декодируете . Вот пример этого:
>>> data = '\xc2\xbd' # UTF-8 encoded 1/2 symbol.
>>> data.encode('cp437')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\dev\python\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
То, что я сделал здесь, это вызов encode
в байтовой строке. Поскольку encode
требуется строка Unicode, Python использовал кодировку по умолчанию ascii
для декодирования строки байта в Unicode, а затем для кодирования в cp437
.
Исправьте это путем декодирования вместо кодирования данных, тогда print
будет автоматически кодировать в стандартный вывод. Пока ваш терминал поддерживает символы в данных, он будет отображаться правильно:
>>> import sys
>>> sys.stdout.encoding
'cp437'
>>> print data.decode('utf8') # implicit encode to sys.stdout.encoding
½
>>> print data.decode('utf8').encode('cp437') # explicit encode.
½