Однострочное решение благодаря @ CJ59:
# print random unicode character from the Basic Multilingual Plane (BMP)
import random
print(chr(random.randint(0,65536)))
Из Питона 3 chr()
документация:
CHR (я)
Возвращает строку, представляющую символ, у которого кодовой точкой Unicode является целое число i. Например, chr (97) возвращает строку «a», а chr (8364) возвращает строку «€». Это обратное значение ord ().
Допустимый диапазон значений аргумента: от 0 до 1 114 111 (0x10FFFF в базе 16). ValueError будет повышен, если я вне этого диапазона.
Решение, которое сохраняет использование `chars` в моем исходном вопросе, благодаря @Matthias, позволяющему выбирать шестнадцатеричные цифры для создания символа юникода:
# print unicode character using select hex chars
import random
chars = '0123456789ABCDEF'
# create random 4 character string from the characters in chars
hexvalue = ''.join(random.choice(chars) for _ in range(4))
# convert string representation of hex value to int,
# then convert to unicode character for printing
print(chr(int(hexvalue, 16)))
Функция, которая возвращает случайный символ Юникода, только если он печатается:
Эта функция использует метод str.isprintable()
для возврата символа, только если он печатается. Это полезно, если вы хотите создать серию символов. Также включает опцию для диапазона символов.
import random
def randomPrintableUnicode(charRange = None):
if charRange is None:
charRange = (0,1114112)
while True:
i = random.randint(*charRange)
c = chr(i)
if c.isprintable():
return c
# should add another conditional break
# to avoid infinite loop
# Print random unicode character
print(randomPrintableUnicode())
# Print random unicode character from the BMP
print(randomPrintableUnicode(charRange = (0,65536)))
# Print random string of 20 characters
# from the Cyrillic alphabet
cyrillicRange = (int('0410',16),int('0450',16))
print(
''.join(
[
randomPrintableUnicode(charRange = cyrillicRange)
for _ in range(20)
]
)
)