Как извлечь правильное значение строки в кодировке UTF-8 (из юникода) из файла из Python3, который был закодирован с использованием Python2? - PullRequest
0 голосов
/ 12 апреля 2019

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

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

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

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

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

Iпопытался добавить 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.

1 Ответ

0 голосов
/ 12 апреля 2019

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

fp.open(filename, 'r')

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

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

    fp.open(filename, 'rb')

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

...