Я конвертирую текстовый файл (words.txt
), который в основном является словарем в этом формате:
good morning, Góðan daginn
в файл json (converted.json
) в этом формате
{
"wordId": 1,
"word": "good morning",
"translation": "Góðan daginn"
}
Преобразование из текстового файла в файл json работает совершенно нормально и, как и ожидалось, но кодировка символов несколько испорчена, и вот как:
для кодирования этого символа ð
вместо этого \u00f0
сценарий кодирует этот символ следующим образом: \u00c3\u00b0
Вопрос: как исправить и/или настроить скрипт, чтобы он правильно кодировал эти специальные символы? имея в виду, что эти символы в основном исландские/скандинавские, и я использую PyCharm в качестве IDE.
PS Пожалуйста, примите во внимание, что мои навыки Python немного ограничены!!
Это скрипт converter.py:
import json
with open('words.txt', 'r') as f_in, \
open('converted.json', 'w') as f_out:
cnt = 1
data = []
for line in f_in:
line = line.split(',')
if len(line) != 2:
continue
d = {"wordId": cnt, "word": line[0].strip(), "translation": line[1].strip()}
data.append(d)
cnt += 1
f_out.write(json.dumps(data, indent=4))
Я использую Python 3
.decode('utf-8')
, потому что в противном случае вы получаете необработанные байтовые строки. (Python 3 предотвращает эту ошибку — настоятельно рекомендуется перейти на Python 3 для любого нового кода!) - person nneonneo   schedule 30.11.2019UTF-8
, аð
в utf-8 имеет код\u00c3\u00b0
. Он имеет код\u00f0
вLatin-1
См.print( 'ð'.encode('latin-1') )
- person furas   schedule 30.11.2019"translation": line[1].strip().encode('latin-1')
, но получил следующую ошибку:UnicodeEncodeError: 'latin-1' codec can't encode character '\u201c' in position 2: ordinal not in range(256)
- person Thorvald Olavsen   schedule 30.11.2019latin2
,cp1250
,cp1251
,cp1252
и т. д.,iso8859-2
и т. д. — некоторые символы могут иметь одинаковый код в разной кодировке. См. таблицу Стандартные кодировки. - person furas   schedule 30.11.2019print( 'ð\u201c'.encode('cp1252') )
даетb'\xf0\x93'
- person furas   schedule 30.11.2019mac_iceland
тоже работает, но дает другие кодыprint('ð\u201c'.encode('mac_iceland'))
- person furas   schedule 30.11.2019.Dart
, поэтому лучше, если я вставлю латиницу-1 - person Thorvald Olavsen   schedule 30.11.2019Dart
, но я бы удивился, если бы мне понадобилсяutf-8
:) - person furas   schedule 30.11.2019