Лучший и чистый способ кодирования Emojis (Python) из текстового файла - PullRequest
0 голосов
/ 05 сентября 2018

Ссылка на этот вопрос: При загрузке в Big Query произошел сбой Emoji

Я ищу лучший и чистый способ кодирования смайликов из этого \ud83d\ude04 типа в этот (Unicode) - \U0001f604, потому что в настоящее время у меня нет никакой идеи, кроме как создать метод python, который будет проходить через текстовый файл и заменить кодировку Emoji.

Эта строка может быть преобразована:

Преобразование смайликов в Unicode и наоборот в Python 3

В качестве предположения, возможно, нужно проходить через текст построчно и преобразовывать его ??

Потенциальная идея:

with open(ff_name, 'rb') as source_file:
  with open(target_file_name, 'w+b') as dest_file:
    contents = source_file.read()
    dest_file.write(contents.decode('utf-16').encode('utf-8'))

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Итак, я предполагаю, что вы каким-то образом получаете необработанную строку ASCII, которая содержит escape-последовательности с кодовыми единицами UTF-16, которые образуют суррогатные пары, и что вы (по любой причине) хотите преобразовать ее в \UXXXXXXXX - формат.

Итак, отныне я предполагаю, что ваш ввод (в байтах!) Выглядит следующим образом:

weirdInput = "hello \\ud83d\\ude04".encode("latin_1")

Теперь вы хотите сделать следующее:

  1. Интерпретировать байты таким образом, что \uXXXX штуковины преобразуются в единицы кода UTF-16. Существует raw_unicode_escapes, но, к сожалению, для исправления суррогатных пар требуется отдельный проход (если честно, я не знаю почему)
  2. Исправить суррогатные пары, преобразовать данные в действительный UTF-16
  3. Декодировать как действительный UTF-16
  4. Снова закодируйте как "raw_unicode_escape"
  5. Декодировать обратно как старый добрый latin_1, состоящий только из старого доброго ASCII с escape-последовательностями Unicode в формате \UXXXXXXXX.

Примерно так:

  output = (weirdInput
    .decode("raw_unicode_escape")
    .encode('utf-16', 'surrogatepass')
    .decode('utf-16')
    .encode("raw_unicode_escape")
    .decode("latin_1")
  )

Теперь, если вы print(output), вы получите:

hello \U0001f604

Обратите внимание, что если вы остановитесь на промежуточном этапе:

smiley = (weirdInput
  .decode("raw_unicode_escape")
  .encode('utf-16', 'surrogatepass')
  .decode('utf-16')
)

тогда вы получите строку юникода со смайликами:

print(smiley)
# hello ?

Полный код:

weirdInput = "hello \\ud83d\\ude04".encode("latin_1")

output = (weirdInput
  .decode("raw_unicode_escape")
  .encode('utf-16', 'surrogatepass')
  .decode('utf-16')
  .encode("raw_unicode_escape")
  .decode("latin_1")
)


smiley = (weirdInput
  .decode("raw_unicode_escape")
  .encode('utf-16', 'surrogatepass')
  .decode('utf-16')
)

print(output)
# hello \U0001f604

print(smiley)
# hello ?
0 голосов
/ 05 сентября 2018

\ud83d\ude04 - это представление символа utf16 SMILING FACE WITH OPEN MOUTH AND SMILING EYES (U+1F604) Вам нужно будет декодировать его в символ, а затем преобразовать кодовую точку символа в шестнадцатеричную строку. Я не знаю достаточно Python, чтобы сказать вам, как это сделать.

...