Распечатка всех смайликов Unicode в файл - PullRequest
0 голосов
/ 09 марта 2020

Возможно напечатать шестнадцатеричный код смайлика с шаблоном u'\uXXX' в Python, например,

>>> print(u'\u231B')
⌛

Однако, если у меня есть список шестнадцатеричного кода, например 231B, просто "добавив" "строка не будет работать:

>>> print(u'\u' + ' 231B')
  File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX escape

Сбой chr() тоже:

>>> chr('231B')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: an integer is required (got type str)

Моя первая часть вопроса с учетом шестнадцатеричного кода, например 231A Как я могу получить str тип эмодзи?

Моя цель - получить список смайликов из https://unicode.org/Public/emoji/13.0/emoji-sequences.txt и прочитать шестнадцатеричный код в первом столбце ,

Есть случаи, когда он колеблется от 231A..231B, вторая часть моего вопроса , учитывая диапазон с шестнадцатеричным кодом, как мне перебрать диапазон, чтобы получить emoji str, например, 2648..2653, можно сделать range(2648, 2653+1), но если в гекса есть символ, например, 1F232..1F236, использование range() невозможно.


Спасибо @amadan за решения !!

TL; DR

Чтобы получить список смайликов из https://unicode.org/Public/emoji/13.0/emoji-sequences.txt в файл.

import requests
response = requests.get('https://unicode.org/Public/emoji/13.0/emoji-sequences.txt')

with open('emoji.txt', 'w') as fout:
    for line in response.content.decode('utf8').split('\n'):
        if line.strip() and not line.startswith('#'):
            hexa = line.split(';')[0]
            hexa = hexa.split('..')            
            if len(hexa) == 1:
                ch = ''.join([chr(int(h, 16)) for h in hexa[0].strip().split(' ')])
                print(ch, end='\n', file=fout)
            else:
                start, end = hexa
                for ch in range(int(start, 16), int(end, 16)+1):
                    #ch = ''.join([chr(int(h, 16)) for h in ch.split(' ')])
                    print(chr(ch), end='\n', file=fout)

1 Ответ

2 голосов
/ 09 марта 2020

Преобразуйте шестнадцатеричную строку в число, затем используйте chr:

chr(int('231B', 16))
# => '⌛'

или непосредственно используйте шестнадцатеричный литерал:

chr(0x231B)

Чтобы снова использовать диапазон, вам необходимо int, либо преобразованный из строки, либо с использованием шестнадцатеричного литерала:

''.join(chr(c) for c in range(0x2648, 0x2654))
# => '♈♉♊♋♌♍♎♏♐♑♒♓'

или

''.join(chr(c) for c in range(int('2648', 16), int('2654', 16)))

(ПРИМЕЧАНИЕ: вы получите что-то очень отличное от range(2648, 2654)!)

...