Python3 - Преобразование строки литералов Unicode в строку Unicode - PullRequest
0 голосов
/ 15 марта 2020

Из параметров командной строки (sys.argv) я получаю строку литералов Unicode, например: '\u041f\u0440\u0438\u0432\u0435\u0442\u0021'

Например, этот скрипт uni.py:

import sys
print(sys.argv[1])

командная строка:

python uni.py \u041f\u0440\u0438\u0432\u0435\u0442\u0021

вывод:

\u041f\u0440\u0438\u0432\u0435\u0442\u0021

Я хочу преобразовать его в строку Unicode 'Привет!'

1 Ответ

0 голосов
/ 15 марта 2020

Вам не нужно конвертировать его в 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 более прост и робастер. Однако лучшее решение зависит от того, что вы строите.

...