Как получить правильное значение строки в кодировке UTF-8 (из Unicode) из файла из Python3, который был закодирован с использованием Python2?

Я перемещаю свое приложение с Python2 на Python 3. Приложение сохраняет конфигурацию в файл, и перед сохранением один из атрибутов кодируется в utf-8.

Например: username='ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ' сохраняется как '\xe1\x9a\xa0\xe1\x9b....x9a\xb1' (преобразованный тип данных - str)

Поскольку этот файл конфигурации будет сохранен при миграции, когда я пытаюсь получить имя пользователя, я не могу декодировать его обратно в unicode, как в python3, объект str не имеет декодирования атрибута. В идеале сохраненное значение в файле должно обрабатываться как байты, но поскольку python2 этого не делает, это создает проблему.

Я не могу преобразовать это в байтовый объект, так как он меняет всю строку, пробовал то же самое.

Невозможно изменить текущий код приложения, так как он уже находится в рабочей среде.

Я попытался добавить b' вручную перед строкой, и это помогло. Но это взлом. Пробовал ast.literal_eval, но снова не работает.

В настоящее время псевдокоды, которые отлично работают на Python2 (до перехода на python3):

1. To save value in text file:
fp=open(filename,'w')
encoded_name=name.encode('utf-8')
fp.write(encoded_name)
fp.close()

2. To retrieve:
fp.open(filename, 'r') #or rb
encoded_name=fp.read()
fp.close()
return encoded_name.decode('utf-8) 

Ожидаемые результаты: имя пользователя, полученное из файла конфигурации, должно обрабатываться как байты, а не как str.


person AbhishekD    schedule 12.04.2019    source источник
comment
объект str не имеет декодирования атрибута. Разве вы не можете просто прочитать это как строку байтов, а затем декодировать ее? Например: stackoverflow.com/a/43337633/8150685. Или, может быть, open(filename, 'r', encoding='utf-8')   -  person Error - Syntactical Remorse    schedule 12.04.2019


Ответы (1)


Если вы используете

fp.open(filename, 'r')

тогда вам не нужно ничего decode, это уже строка юникода.

Но если вы используете

    fp.open(filename, 'rb')

это должно быть расшифровано с помощью encoded_name.decode('utf-8')

person brevno    schedule 12.04.2019