Как преобразовать юникод эмодзи в короткое имя CLDR - PullRequest
0 голосов
/ 30 апреля 2020

Я использую python для извлечения комментариев и их отображения. Это выглядит так, когда я его печатаю.

This was heart wrenching \u2764\ufe0f
Amazing compassion \ud83d\udc9c\ud83d\udc9c\ud83d\udc9c #tears
\u2764\ufe0f\u2764\ufe0f\u2764\ufe0f

Как преобразовать юникоды смайликов в соответствующие им короткие имена CLDR? Например, U + 1F44D будет печататься как палец вверх.

1 Ответ

1 голос
/ 30 апреля 2020

РЕДАКТИРОВАТЬ: Я думаю, я нашел решение для проблемы с кодами \ud83d\udc9c

text = text.encode('utf-16', 'surrogatepass').decode('utf-16')

Он преобразует суррогатное значение \ud83d\udc9c в правильное значение Emoji \U0001f49c

Источник: Как работать с суррогатными парами в Python?

Википедия: Суррогат

Другое: Инспектор символов Unicode


С помощью Google я нашел

print('\U0001F44D'.encode('ascii', 'namereplace').decode())

Результат

\N{THUMBS UP SIGN}

И

import unicodedata

print(unicodedata.name('\U0001F44D'))

Результат:

THUMBS UP SIGN

Так что лучше использовать Google, прежде чем спрашивать о Stackoverflow.

https://docs.python.org/3/howto/unicode.html


То же самое для текста

text = '''This was heart wrenching \u2764\ufe0f
Amazing compassion \ud83d\udc9c\ud83d\udc9c\ud83d\udc9c #tears
\u2764\ufe0f\u2764\ufe0f\u2764\ufe0f'''

print(text.encode('ascii', 'namereplace').decode())

Результат:

This was heart wrenching \N{HEAVY BLACK HEART}\N{VARIATION SELECTOR-16}
Amazing compassion \ud83d\udc9c\ud83d\udc9c\ud83d\udc9c #tears
\N{HEAVY BLACK HEART}\N{VARIATION SELECTOR-16}\N{HEAVY BLACK HEART}\N{VARIATION SELECTOR-16}\N{HEAVY BLACK HEART}\N{VARIATION SELECTOR-16}
\N{THUMBS UP SIGN}

Теперь вам, возможно, придется удалить \N{ и }

Но у него есть проблемы с \ud83d\udc9c\ud83d\udc9c\ud83d\udc9c


Вы можете использовать unicodedata в for -l oop, чтобы получить имена для каждого символа в тексте, но могут возникнуть проблемы, если у него нет имени ie. '\n'. И это также дает имена для обычных символов, поэтому вам, возможно, придется использовать unicodedata.category(), чтобы решить, какие символы заменить.

Это также имеет проблему с \ud83d\udc9c\ud83d\udc9c\ud83d\udc9c

import unicodedata

# http://www.unicode.org/reports/tr44/#General_Category_Values

for char in text:
    try:
        print(char, '|', unicodedata.category(char), '|', unicodedata.name(char))
    except ValueError:
        print(repr(char), '| (repr)')

Результат:

T | Lu | LATIN CAPITAL LETTER T
h | Ll | LATIN SMALL LETTER H
i | Ll | LATIN SMALL LETTER I
s | Ll | LATIN SMALL LETTER S
  | Zs | SPACE
w | Ll | LATIN SMALL LETTER W
a | Ll | LATIN SMALL LETTER A
s | Ll | LATIN SMALL LETTER S
  | Zs | SPACE
h | Ll | LATIN SMALL LETTER H
e | Ll | LATIN SMALL LETTER E
a | Ll | LATIN SMALL LETTER A
r | Ll | LATIN SMALL LETTER R
t | Ll | LATIN SMALL LETTER T
  | Zs | SPACE
w | Ll | LATIN SMALL LETTER W
r | Ll | LATIN SMALL LETTER R
e | Ll | LATIN SMALL LETTER E
n | Ll | LATIN SMALL LETTER N
c | Ll | LATIN SMALL LETTER C
h | Ll | LATIN SMALL LETTER H
i | Ll | LATIN SMALL LETTER I
n | Ll | LATIN SMALL LETTER N
g | Ll | LATIN SMALL LETTER G
  | Zs | SPACE
❤ | So | HEAVY BLACK HEART
️ | Mn | VARIATION SELECTOR-16
'\n' | (repr)
A | Lu | LATIN CAPITAL LETTER A
m | Ll | LATIN SMALL LETTER M
a | Ll | LATIN SMALL LETTER A
z | Ll | LATIN SMALL LETTER Z
i | Ll | LATIN SMALL LETTER I
n | Ll | LATIN SMALL LETTER N
g | Ll | LATIN SMALL LETTER G
  | Zs | SPACE
c | Ll | LATIN SMALL LETTER C
o | Ll | LATIN SMALL LETTER O
m | Ll | LATIN SMALL LETTER M
p | Ll | LATIN SMALL LETTER P
a | Ll | LATIN SMALL LETTER A
s | Ll | LATIN SMALL LETTER S
s | Ll | LATIN SMALL LETTER S
i | Ll | LATIN SMALL LETTER I
o | Ll | LATIN SMALL LETTER O
n | Ll | LATIN SMALL LETTER N
  | Zs | SPACE
'\ud83d' | (repr)
'\udc9c' | (repr)
'\ud83d' | (repr)
'\udc9c' | (repr)
'\ud83d' | (repr)
'\udc9c' | (repr)
  | Zs | SPACE
# | Po | NUMBER SIGN
t | Ll | LATIN SMALL LETTER T
e | Ll | LATIN SMALL LETTER E
a | Ll | LATIN SMALL LETTER A
r | Ll | LATIN SMALL LETTER R
s | Ll | LATIN SMALL LETTER S
'\n' | (repr)
❤ | So | HEAVY BLACK HEART
️ | Mn | VARIATION SELECTOR-16
❤ | So | HEAVY BLACK HEART
️ | Mn | VARIATION SELECTOR-16
❤ | So | HEAVY BLACK HEART
️ | Mn | VARIATION SELECTOR-16

Поскольку у него есть проблема с \ud83d\udc9c\ud83d\udc9c\ud83d\udc9c, поэтому я заменяю его на ?

import unicodedata

text = '''This was heart wrenching \u2764\ufe0f
Amazing compassion \ud83d\udc9c\ud83d\udc9c\ud83d\udc9c #tears
\u2764\ufe0f\u2764\ufe0f\u2764\ufe0f'''

result = []

for char in text:
    if unicodedata.category(char) in ('So', 'Mn'):
        result.append(':{}:'.format(unicodedata.name(char)))
    elif unicodedata.category(char) in ('Cs'):
        result.append('?') #char)
    else:
        result.append(char)

print(''.join(result)) 

Результат:

This was heart wrenching :HEAVY BLACK HEART::VARIATION SELECTOR-16:
Amazing compassion ?????? #tears
:HEAVY BLACK HEART::VARIATION SELECTOR-16::HEAVY BLACK HEART::VARIATION SELECTOR-16::HEAVY BLACK HEART::VARIATION SELECTOR-16:

РЕДАКТИРОВАТЬ: снова используя Google, я нашел внешний модуль emoji , который может преобразовать некоторые имена, но у него также есть проблема с \ud83d\udc9c, поэтому я использовал repr для его отображения - но он также выводит новую строку как \n

text = '''This was heart wrenching \u2764\ufe0f
Amazing compassion \ud83d\udc9c\ud83d\udc9c\ud83d\udc9c #tears
\u2764\ufe0f\u2764\ufe0f\u2764\ufe0f'''

import emoji

#print( repr(emoji.demojize(text, use_aliases=True)) ) 
print( repr(emoji.demojize(text)) ) 

Результат:

'This was heart wrenching :heart:\nAmazing compassion \ud83d\udc9c\ud83d\udc9c\ud83d\udc9c #tears\n:heart::heart::heart:'

http://www.unicode.org/emoji/charts/full-emoji-list.html

https://www.webfx.com/tools/emoji-cheat-sheet/

http://unicode.org/Public/emoji/12.0/emoji-test.txt


Кстати: Я нашел модуль demoji , который может найти смайлики и дать имена. Но также есть проблема с кодом \ud83d\udc9c

import demoji

# run only once after installing module
demoji.download_codes()

print(demoji.findall(text))

Требуется demoji.download_codes() только один раз - после установки модуля.

Результат:

{'❤️': 'red heart'}

Если вы получите его как JSON data "\ud83d\udc9c", тогда у вас не должно возникнуть проблем - он должен автоматически конвертировать

import json

# escaped unicode in " "  
data = r'"\ud83d\udc9c"' 
print(json.loads(data))

В других случаях вам придется конвертировать его

# convert to escaped unicode and put in " "  
data = '"{}"'.format('\ud83d\udc9c'.encode('unicode-escape').decode())
print(json.loads(data))

Как работать с суррогатными парами в Python?

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