образец кода:
>>> import json
>>> json_string = json.dumps("ברי צקלה")
>>> print json_string
"\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
Проблема: она не читается человеком. Мои (умные) пользователи хотят проверять или даже редактировать текстовые файлы с помощью дампов JSON (и я бы предпочел не использовать XML).
Есть ли способ сериализации объектов в строки JSON UTF-8 (вместо \uXXXX
)?
Ответы:
Используйте
ensure_ascii=False
переключатель, чтобыjson.dumps()
затем кодировать значение в UTF-8 вручную:Если вы пишете в файл, просто используйте
json.dump()
и оставьте его объекту file для кодирования:Предостережения для Python 2
Для Python 2 есть еще несколько предостережений, которые необходимо учитывать. Если вы записываете это в файл, вы можете использовать его
io.open()
вместо того,open()
чтобы создавать объект файла, который кодирует значения Unicode для вас при записи, а затем использоватьjson.dump()
вместо этого запись в этот файл:Обратите внимание , что существует ошибка в
json
модуле , гдеensure_ascii=False
флаг может производить смесь изunicode
иstr
объектов. Обходной путь для Python 2:В Python 2 при использовании байтовых строк (тип
str
), закодированных в UTF-8, обязательно также установитеencoding
ключевое слово:источник
Написать в файл
Для печати на стандартный вывод
источник
codecs
библиотеку. Спасибо!ОБНОВЛЕНИЕ: Это неправильный ответ, но все же полезно понять, почему это неправильно. Смотрите комментарии.
Как насчет
unicode-escape
?источник
unicode-escape
не обязательно: вы можете использоватьjson.dumps(d, ensure_ascii=False).encode('utf8')
вместо этого. И не гарантируется, что json во всех случаях будет использовать те же правила, что иunicode-escape
кодек в Python, т. Е. Результат может совпадать или не совпадать в некоторых угловых случаях. Понижение - за ненужное и, возможно, неправильное обращение. Несвязанный: работает только для языков utf8 или если envvar задает здесь utf8 (вместо этого выведите Unicode).print json_str
PYTHONIOENCODING
json.dumps(d, ensure_ascii=False).encode('utf8')
не работает, по крайней мере для меня. Я получаюUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position ...
ошибку.unicode-escape
Вариант работает отлично однако.Обходной путь Peters 2 для Python 2 завершается неудачно:
Это было сбой в части .decode ('utf8') строки 3. Я исправил проблему, сделав программу намного проще, избегая этого шага, а также особый корпус ascii:
источник
unicode(data)
подход является лучшим вариантом, чем использование обработки исключений. Обратите внимание, чтоencoding='utf8'
ключевое слово аргумент не имеет ничего общего с выводом, которыйjson.dumps()
производит; используется для декодированияstr
входных данных, которые получает функция.open('filename', 'wb').write(json.dumps(d, ensure_ascii=False).encode('utf8'))
он работает независимо от того,dumps
возвращает ли (только для ascii) объект str или unicode.str.encode('utf8')
декодируется неявно. Но так жеunicode(data)
, если данstr
объект. :-) Использованиеio.open()
дает вам больше возможностей, включая использование кодека, который записывает спецификацию, и вы отслеживаете данные JSON чем-то другим..encode('utf8')
вариант на основе работает как на Python 2 и 3 (один и тот же код). Наunicode
Python 3 нет. Не имеет отношения: файлы json не должны использовать BOM (хотя подтверждающий анализатор json может игнорировать BOM, см. Ошибку 3983 ).encoding='utf8'
кjson.dumps
решает проблему. PS У меня есть текст на кириллицеНачиная с Python 3.7, следующий код работает нормально:
Вывод:
источник
Следующее мое понимание var читая ответ выше и гугл.
источник
Вот мое решение с использованием json.dump ():
где SYSTEM_ENCODING установлен в:
источник
Используйте кодеки, если это возможно,
источник
Спасибо за оригинальный ответ здесь. С python 3 следующая строка кода:
было хорошо Попробуйте не писать слишком много текста в коде, если это не обязательно.
Это может быть достаточно для консоли Python. Однако, чтобы удовлетворить сервер, вам может потребоваться установить локаль, как описано здесь (если он на apache2) http://blog.dscpl.com.au/2014/09/setting-lang-and-lcall-when-using .html
в основном установите he_IL или любой другой языковой стандарт на Ubuntu, проверьте, что он не установлен
установите его там, где XX ваш язык
Например:
добавьте следующий текст в / etc / apache2 / envvrs
Чем, надеюсь, вы не получите ошибок Python от Apache, например:
Также в apache попробуйте сделать utf кодировкой по умолчанию, как описано здесь:
Как изменить кодировку по умолчанию на UTF-8 для Apache?
Сделайте это рано, потому что ошибки apache могут быть болезненными для отладки, и вы можете ошибочно думать, что это от python, что, возможно, не так в этой ситуации
источник
Если вы загружаете строку JSON из файла и содержимое файла арабскими текстами. Тогда это будет работать.
Предположим, что файл как: arabic.json
Получить арабское содержимое из файла arabic.json
Чтобы использовать данные JSON в шаблоне Django, выполните следующие действия:
источник
fh.close()
fh
не определеноf.close()
использовать Unicode-escape для решения проблемы
объяснять
Оригинальный ресурс: https://blog.csdn.net/chuatony/article/details/72628868
источник
Использование sure_ascii = False в json.dumps - правильное направление для решения этой проблемы, как отметил Мартейн. Однако это может вызвать исключение:
Вам нужны дополнительные настройки в site.py или sitecustomize.py, чтобы правильно настроить sys.getdefaultencoding (). site.py находится в lib / python2.7 /, а sitecustomize.py находится в lib / python2.7 / site-packages.
Если вы хотите использовать site.py, в def setencoding (): измените первое, если 0: на, если 1: так, чтобы python использовал локаль вашей операционной системы.
Если вы предпочитаете использовать sitecustomize.py, который может не существовать, если вы его еще не создали. просто поместите эти строки:
Затем вы можете сделать некоторые китайские выходные данные в формате json в формате utf-8, например:
Вы получите строку в кодировке utf-8 вместо \ u экранированной строки json.
Чтобы проверить кодировку по умолчанию:
Вы должны получить "utf-8" или "UTF-8", чтобы проверить ваши настройки site.py или sitecustomize.py.
Обратите внимание, что вы не можете выполнить sys.setdefaultencoding ("utf-8") на интерактивной консоли Python.
источник
json
'sensure_ascii=False
. Укажите минимально полный пример кода, если вы думаете иначе.