Кодировка JSON не учитывает аргумент кодирования в Python - PullRequest
0 голосов
/ 29 апреля 2018

Попытка кодировать файл json с помощью каталога utf (utf-8-sig), с помощью этого кода

data =json.load(open("data.json", encoding = "utf-8-sig"))

Но похоже, что аргумент кодирования игнорируется, выдавая эту ошибку

    Traceback (most recent call last):
  File "app1.py", line 11, in <module>
    print(k,v)
UnicodeEncodeError: 'ascii' codec can't encode character '\xb0' in position 141: ordinal not in
range(128)

Редактировать: тип данных файла data.json равен <class '_io.TextIOWrapper'>, и вот полный стек:

import json
data =json.load(open("data.json", encoding = "utf-8-sig"))
for k,v in data.items():
    print(k,v)

Edit2: двоичный образец файла с использованием print(open("data.json"), "rb").read(180)

b '{"заброшенный промышленный сайт": ["Сайт, который нельзя использовать ни для каких цель, будучи загрязненной загрязняющими веществами. "]," брошенный автомобиль ": ["Транспортное средство, которое было выброшено в envir '

1 Ответ

0 голосов
/ 30 апреля 2018

Как отметил @tdelaney в комментариях, вы смотрите не ту проблему:

Ошибка не в open, не в json.read, не в итераторе data.items(), так что это не проблема декодирования , между utf-8-sig и строкой Unicode.

Но проблема в print. Проблема заключается в кодировке , поэтому это означает, что ошибка находится между строкой Unicode в python и результирующей кодировкой binary . В этом случае строка в кодировке Юникод преобразуется в ascii, но ascii не может представлять все оригинальные символы.

Есть два решения:

  • Вы можете разрешить своему терминалу принимать символы UTF-8. Это можно сделать, установив, например, LANG=C.UTF-8 (поддерживается только в нескольких системах) или LANG=en_US.UTF-8 или в других локалях (проверьте в вашей системе, какие локали поддерживают UTF-8).

  • вы заставляете print печатать только ascii, как предложено @tdelaney print(k.encode('ascii', 'replace'), v.encode('ascii', 'replace')). Вы можете изменить replace на backslashreplace или ignore. (см. https://docs.python.org/3/library/codecs.html#codec-base-classes).

Есть также гибридное решение (но не совсем безопасное и переносимое во всех системах) (например, принуждение Python к выводу в определенной кодировке) и множество хаков, но это усложнит ваш код, поэтому я не рекомендую его ( и вы должны обернуть их в новую функцию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...