Вам не нужно конвертировать его в Unicode, потому что он уже равен Unicode. В Python 3.x строки по умолчанию являются Unicode. Их нужно преобразовывать (или bytes
) только в том случае, если вы хотите прочитать или записать байты, например, при записи в файл.
Если вы просто напечатаете строку, вы получите правильный результат, при условии, что ваш терминал поддерживает символы.
print('\u041f\u0440\u0438\u0432\u0435\u0442\u0021')
Будет напечатано:
Привет!
ОБНОВЛЕНИЕ
После обновления вашего вопроса мне стало ясно, что упомянутая строка на самом деле является не строковым литералом (или литералом Юникода), а вводом из командной строки. В этом случае вы можете использовать кодировку «unicode-escape», чтобы получить желаемый результат. Обратите внимание, что кодирование работает от Unicode до байтов, а декодирование работает от байтов до Unicode. В этом случае вам нужно преобразование из Unicode в Unicode, поэтому вы должны добавить «фиктивный» этап декодирования с использованием кодировки latin-1, который прозрачно преобразует кодовые точки Unicode в байты.
Следующий код напечатает правильный результат для вашего примера:
text = sys.argv[1].encode('latin-1').decode('unicode-escape')
print(text)
ОБНОВЛЕНИЕ 2
В качестве альтернативы, вы можете использовать ast.literal_eval()
для анализа строки из ввода. Однако этот метод ожидает правильный литерал Python, включая кавычки. Вы можете сделать что-то вроде этого, чтобы решить это:
text = ast.literal_eval("'" + sys.argv[1] + "'")
Но учтите, что это сломается, если у вас будет кавычка как часть вашей входной строки. Я думаю, что это что-то вроде хака, поскольку этот метод, вероятно, не предназначен для той цели, которую вы используете. Unicode-escape более прост и робастер. Однако лучшее решение зависит от того, что вы строите.