Похоже, у вас какая-то проблема с кодировкой.
Во-первых, вы должны быть очень уверены, какую кодировку использует Amazon в теле отчета, которое они вам отправляют. Это UTF-8? Это ISO 8859-1? Что-то еще?
К сожалению, Документация по API Amazon MWS Reports , особенно их Справочник по API , пока не очень подходит к тому, какую кодировку они используют. Они упоминают только кодировку UTF-8, так что это должно быть ваше первое предположение. Документация API GetReport
(стр.36-37) описывает элемент ответа Report
как тип xs:string
, но я не вижу, где они определяют этот тип данных. Может быть, они означают тип XML-схемы string
тип данных .
Итак, я предлагаю вам сохранить байтовую последовательность, которую вы получаете как тело отчета от Amazon, в файле с нулевыми преобразованиями. Помните, что ваш код, который вызывает AWS, может непреднамеренно изменить строку тела отчета. Изучите байты не ASCII в этом файле с помощью двоичного редактора. Сохраняется ли «São» из «São» как S\xC3\xA3o
, что указывает на кодировку UTF-8? Или он хранится как S\xE3o
, что указывает на кодировку ISO 8859-1 ?
Я предполагаю, что вы получите свой отчет в виде простого файла. В документации Amazon AWS говорится, что вы можете запросить отчеты, которые будут доставлены вам в формате XML. Это даст вам преимущество, предоставив вам ответ с явным объявлением кодировки.
Как только вы узнаете кодировку тела отчета, теперь вам нужно правильно обработать его. Вы подразумеваете, что используете фреймворк Django и код языка Python для получения отчета от Amazon AWS.
Одна вещь, которая должна стать очень ясной (как объясняет Скирмантас):
- Строки Unicode содержат символы. Строки байтов содержат байты (октеты).
- Кодировка преобразует строку Unicode в строку байтов.
- Декодирование преобразует строку байтов в строку Unicode.
Строка, которую вы получаете от Amazon AWS, представляет собой строку байт . Вам нужно декодировать , чтобы получить строку Unicode. Но ваш фрагмент кода, encodeme = 'São Paulo'
, дает вам строку байтов. encodeme.encode('utf-8)
выполняет кодирование () в байтовой строке, а это не то, что вам нужно. (Отсутствующая заключительная цитата на 'utf-8
не помогает.)
Попробуйте этот пример кода:
>>> reportbody = 'S\xc3\xa3o Paulo' # UTF-8 encoded byte string
>>> reportbody.decode('utf-8') # returns a Unicode string, u'...'
u'S\xe3o Paulo'
Возможно, вам пригодятся некоторые материалы для чтения. Я согласен с Hoxieboy, что вам стоит потратить время на чтение Python's Unicode HOWTO . Также ознакомьтесь с основными ответами на Что мне нужно знать о Unicode? .