Существует значительная проблема с некоторыми из ответов, опубликованных до сих пор: unicode()
декодирует кодировку по умолчанию, которая часто является ASCII; на самом деле, unicode()
пытается сделать «смысл» байтов, которые он задает, преобразуя их в символы. Таким образом, следующий код, который по сути является тем, что рекомендуется в предыдущих ответах, не работает на моей машине:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
дает:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Ошибка возникает из-за того, что author
не содержит только ASCII-байты (т. е. со значениями в [0; 127]), а unicode()
по умолчанию декодирует из ASCII (на многих машинах).
Надежное решение должно явно указывать кодировка, используемая в ваших полях; взяв UTF-8 в качестве примера:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(или без начального u
, в зависимости от того, хотите ли вы результат Unicode или байтовую строку).
При этом то можно подумать о том, что поля author
и publication
являются строками Unicode, а не декодировать их во время форматирования.
Для получения массива как результата строки json, необходимо установить второй параметрический усилитель как верную булевскую переменную.
$result = json_decode($json_string, true);
$context = $result['context'];
Иначе $result будет объектом станд. но можно получить доступ к значениям как к объекту.
$result = json_decode($json_string);
$context = $result->context;