Удаление нелатинских символов из строки в Python3 - PullRequest
0 голосов
/ 29 мая 2020

Я передаю строку PIL s multiline_text(), которая по какой-то причине не поддерживает utf-8, а поддерживает только латинские символы.

from PIL import Image, ImageDraw

input_string = "‘Hi’"

img_width = 500
img_height = 500
img = Image.new('RGB', (img_width, img_height), (255, 255, 255))
img_D = ImageDraw.Draw(img)
img_D.multiline_text((0, 0), input_string)    # <- bug here
img.save("test_img.jpeg", 'jpeg', optimize=True, quality = 200)

Я получаю это сообщение об ошибке: UnicodeEncodeError: 'latin-1' codec can't encode character '\u2018' in position 0: ordinal not in range(256)

Поэтому мне нужно избавиться от всех нелатинских символов. Как я могу это сделать?

Примечание: я видел этот ответ , а именно input_string = regex.sub(ur'[^\p{Latin}]', u'', t1), но я почти уверен, что это для Python2, я получаю следующую ошибку: SyntaxError: invalid syntax. Если я удалю u, r или оба, я получу error: bad escape \p.

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Поскольку ваш комментарий пояснил, что ваш вопрос касается рендеринга символов Юникода, а не удаления символов Юникода, я приведу пример загрузки и рисования со шрифтом, который поддерживает символы Юникода.

В этом примере я использовал Roboto Mono Bold , который можно загрузить с Google Fonts.

from PIL import Image, ImageDraw, ImageFont

haiku = '''bruits de neige et d’encre
frôlement d’âmes et d’ailes
deux papillons s’aiment'''

font = ImageFont.truetype('RobotoMono-Bold.ttf', 18)
haiku_dimensions = font.getsize_multiline(haiku)

padding = 4
with Image.new('RGB', tuple(d + (4 * padding) for d in haiku_dimensions), color=(180, 180, 180)) as image:
    draw = ImageDraw.Draw(image)
    draw.multiline_text((padding, padding), haiku, font=font, fill=(20,20,20))
    image.save('output.png')

Результат выглядит следующим образом:

A haiku with French characters

0 голосов
/ 29 мая 2020

Частично найдено:

input_string = "‘Hi’"

input_string = input_string.encode("latin", "ignore") 
# you can also try "replace" but in the case of ‘ and ’ it doesn't work as it outputs b'?Hi?'

print(input_string)
# b'Hi' is a bytes object, to turn it back into a string, do:

input_string = input_string.decode("utf-8", "ignore") 
# same thing, you can also try "replace", but it might lose you some characters

print(input_string)
# Hi

Однако в более длинных строках он также удаляет символы с диакритическими знаками (éèàù), так что это не идеально ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...