Преобразование строкового представления юникода смайликов в смайлики юникода в python - PullRequest
0 голосов
/ 02 мая 2018

Я использую Python2 на Spark (PySpark и Pandas) для анализа данных об использовании смайликов. У меня есть строка типа u'u+1f375' или u'u+1f618', которую я хочу преобразовать в ? и ? соответственно.

Я прочитал несколько других сообщений SO и Юникод HOWTO , пытаясь понять encode и decode безрезультатно.

Это не сработало:

decode_udf = udf(lambda x: x.decode('unicode-escape'))
foo = emojis.withColumn('decoded_emoji', decode_udf(emojis.emoji))
Result: decoded_emoji=u'u+1f618'

Это закончилось тем, что работало на разовой основе, но потерпело неудачу, как только я применил его к своему RDD.

def rename_if_emoji(pattern):
  """rename the element name of dataframe with emoji"""

  if pattern.lower().startswith("u+"):
    emoji_string = ""
    EMOJI_PREFIX = "u+"
    for part_org in pattern.lower().split(" "):
      part = part_org.strip();
      if (part.startswith(EMOJI_PREFIX)):
        padding = "0" * (8 + len(EMOJI_PREFIX) - len(part)) 
        codepoint = '\U' + padding + part[len(EMOJI_PREFIX):]
        print("codepoint: " + codepoint)
        emoji_string += codepoint.decode('unicode-escape')
        print("emoji_string: " + emoji_string)
    return emoji_string
  else:
    return pattern

rename_if_emoji_udf = udf(rename_if_emoji)

Ошибка: UnicodeEncodeError: 'ascii' codec can't encode character u'\U0001f618' in position 14: ordinal not in range(128)

1 Ответ

0 голосов
/ 02 мая 2018

Способность правильно печатать эмодзи зависит от используемой IDE / терминала. Вы получите UnicodeEncodeError на неподдерживаемом терминале из-за print кодировки Unicode в Python 2 для кодировки терминала. Вам также нужна поддержка шрифтов. Вы ошибка на print. Вы правильно его расшифровали, но в идеале ваше устройство вывода должно поддерживать UTF-8.

Пример упрощает процесс декодирования. Я печатаю repr() строки на случай, если терминал не настроен для поддержки печатаемых символов.

import re

def replacement(m):
    '''Assume the matched characters are hexadecimal, convert to integer,
       format appropriately, and decode back to Unicode.
    '''
    i = int(m.group(1),16)
    return '\\U{:08X}'.format(i).decode('unicode-escape')

def replace(s):
    '''Replace all u+nnnn strings with the Unicode equivalent.
    '''
    return re.sub(ur'u\+([0-9a-fA-F]+)',replacement,s)

s = u'u+1f618 u+1f375'
t = replace(s)
print repr(t)
print t

Выход (на IDE UTF-8):

u'\U0001f618 \U0001f375'
? ?
...