Есть ли функция Python для преобразования литералов Unicode в читаемую форму? - PullRequest
0 голосов
/ 06 мая 2019

Я успешно декомпилировал файлы Python 2.7 с расширением .pyc. Проблема в том, что оригинальные скрипты содержат блоки комментариев на русском языке, и после декомпиляции они были преобразованы в необработанные литералы Unicode,

например

msg = u '\ u0444 \ u0430 \ u0439 \ u043b \ u0435'

и мне трудно преобразовать их в читаемую форму. Я предполагаю, что в python есть функция, которая принимает литералы юникода в качестве аргумента и выдает читаемую строку на выходе, но мои поиски были напрасны.

1 Ответ

0 голосов
/ 06 мая 2019

Действительно ли в ваших данных есть пробелы между \ и u?Это вызовет проблемы с разбором, поэтому вам нужно сначала удалить их.Вы не можете использовать replace(" ",""), потому что строка будет уже отформатирована как \\, если они не предшествуют u.

После того, как вы получите правильную строку, вы можете либо (1) использоватьPython 3 или (2) импортировать поддержку Unicode в 2.7 или (3) использовать u"" строки в 2.7 ...

В Python 3:

mytext='\u0444 \u0430 \u0439 \u043b \u0435'
print(mytext)

Python 2.7:

from __future__ import unicode_literals
mytext='\u0444 \u0430 \u0439 \u043b \u0435'
print mytext

Python 2.7 без импорта:

mytext=u'\u0444 \u0430 \u0439 \u043b \u0435'
# note the `u` before the string. 
# In your example, you'd remove all those extra spaces
print mytext

Вывод:

ф а й л е

ОБНОВЛЕНИЕ: Если ваш вывод в точности соответствует написанному выше,затем вы сможете сначала изменить строку, чтобы избавиться от посторонних пробелов, а затем оценить ее для создания правильного формата.(Спасибо @lenz за комментарий о literal_eval.)

import ast
original = "msg = u '\ u0444 \ u0430 \ u0439 \ u043b \ u0435'"
despaced = original.replace("u '","u'").replace("\\ ","\\")
# chop off original assignment with split() and assign to new variable
cleaned  = ast.literal_eval(despaced.split("=")[1].strip())
print cleaned

Вывод:

ф а й л е
...