Кодировка JSON файла
Есть json файл:
{
"test": [
{
"name": "a b"
},
{
"name": "\u00d0\u0095\u00d0\u00bb\u00d0\u00b5\u00d0\u00bd\u00d0\u00b0 \u00d0\u0093\u00d0\u00b5\u00d0\u00bc\u00d0\u00bf\u00d0\u00b5\u00d0\u00bb\u00d1\u008c"
}
]
}
Пыталась избавиться от проблем с кодировкой, но не выходит.
Почему этот код не сработал?
import json
import codecs
with open('test.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(json.dumps(data, sort_keys=False, indent=4, ensure_ascii=False, separators=(',', ': ')))
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
Тут похоже неправильно в самом json данные записаны. У меня получилось декодировать строку так:
s = "\u00d0\u0095\u00d0\u00bb\u00d0\u00b5\u00d0\u00bd\u00d0\u00b0 \u00d0\u0093\u00d0\u00b5\u00d0\u00bc\u00d0\u00bf\u00d0\u00b5\u00d0\u00bb\u00d1\u008c"
print(s.encode('latin').decode('utf-8'))
Вывод: Елена Гемпель
Решал методом подбора фактически. Сначала попробовал избавиться от нулей в кодах символов (т.к. они у были у каждого символа), например '\u00d0' превратить в '\xd0'. Для этого подошло s.encode('latin'). Потом результат попробовал декодировать разными кодировками, подошла кодировка utf-8:
>>> s = "\u00d0\u0095\u00d0\u00bb\u00d0\u00b5\u00d0\u00bd\u00d0\u00b0 \u00d0\u00
... 93\u00d0\u00b5\u00d0\u00bc\u00d0\u00bf\u00d0\u00b5\u00d0\u00bb\u00d1\u008c"
>>> s
'Ð\x95лена Ð\x93емпелÑ\x8c'
>>> s.encode()
b'\xc3\x90\xc2\x95\xc3\x90\xc2\xbb\xc3\x90\xc2\xb5\xc3\x90\xc2\xbd\xc3\x90\xc2\xb0 \xc3\x90\xc2\x93\xc3\x90\xc2\xb5\xc3\x90\xc2\xbc\xc3\x90\xc2\xbf\xc3\x90\xc2\xb5\xc3\x90\xc2\xbb\xc3\x91\xc2\x8c'
>>> s.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)
'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)
>>> s.encode('latin')
b'\xd0\x95\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb0 \xd0\x93\xd0\xb5\xd0\xbc\xd0\xbf\xd0\xb5\xd0\xbb\xd1\x8c'
>>> s.encode('latin').decode('cp1251')
'Елена Гемпель'
>>> s.encode('latin').decode('cp1252')
'Елена Гемпель'
>>> s.encode('latin').decode('utf-8')
'Елена Гемпель'