Есть ли способ генерировать Unicode, поместив '\' перед строкой с Python? - PullRequest
2 голосов
/ 19 июня 2019

Вот обычный способ печати Unicode.

print('\u2080')

, который выводит символ подписи

формат строки дает некоторый материал

for i in range(3):
    print('u208{}'.format(i))

вывод

u2080
u2081
u2082

Я пытаюсь сгенерировать юникод, поставив перед ними '\'.

Я думаю, что я почти на месте.

print('\\'+'u2080')

выводит

\u2080

Как мне сделать дальше, чтобы этот вывод выводил подписки ₀?

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Вы можете использовать ord для преобразования символа Юникод в целое число, применить свое преобразование (здесь могут пригодиться побитовые операторы в зависимости от того, что вы делаете), а затем chr для преобразования обратно в символ Юникод:

>>> print(list(chr(ord('\u2080') | i) for i in range(10)))
['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉']

Вы также можете пропустить ord и перейти от int к символу:

>>> print(list(chr(0x2080 + i) for i in range(10)))
['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉']
0 голосов
/ 19 июня 2019

На самом деле, работая только со строками, не прибегая к извлечению номера кодовой точки и используя функцию chr, можно создать соответствующие символы Юникода:

Модуль codecs вВ stdlib есть функции для регистрации и получения текстовых кодеков: сопоставления текста и байтов и некоторые другие преобразования текста или байтов.

Среди этих преобразований есть символ unicode_escape.Его можно использовать непосредственно при преобразовании объекта байтов в текст с использованием метода bytes.decode, но его также можно получить с помощью codecs.getdecoder("unicode_escape") и преобразовать текст в текст.

Поэтому можно выполнить:

In [139]: import codecs                                                                                                                                

In [140]: esc = codecs.getdecoder("unicode_escape")                                                                                                    

In [141]: for i in range(10): 
     ...:     print(esc(f"\\u208{i}")[0], end=" ") 
     ...:      
     ...:      
     ...:                                                                                                                                              
₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ 

Вызов декодеру возвращает кортеж с результатом и количеством использованных входных символов.[0] после вызова получает только преобразованный результат.

(Выше я использовал синтаксис "f-string", который заменил метод .format почти для всех применений в Python 3.6)

Обычно каждый предпочитает использовать встроенный chr, так как он избегает манипулирования с форматированием строк и может работать с числами напрямую.(если бы мы хотели, чтобы более 16 символов начинались с определенной кодовой точки, описанный выше метод не работал бы, как есть, например).

print(" ".join(chr(0x2080 + i) for i in range(29)))

выведет:

₀ ₁ ₂ ₃10 ₅ 10 ₇ ₈ ₉ ₋ ₋ ₌₎ ₏ ₏ ₒ ₒ ₕ ₖ ₖ ₘ ₙ 10 10 10

...