неизвестная кодировка для сообщений в Facebook [дубликаты]

1

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

Моя проблема в том, что я нахожусь на французском языке, большинство моих разговоров на французском языке, и есть довольно много специальных символов (то же самое для смайликов):

{
      "sender_name": "Antoine",
      "timestamp_ms": 1493930091160,
      "content": "Comment il est \u00c3\u00a9go\u00c3\u00afste :s",
      "type": "Generic"
    },

Вот пример: в мессенджере это заклинание:

"Комментарий il est égoïste: s"

но если я декодирую символ unicode, используя unicode или utf-8, все, что я получаю, это:

"Комментарий il est à goïste"

И когда я пытаюсь записать их на консоль, он сбрасывает ее с помощью UnicodeEncodeError.

Мои попытки до сих пор состояли из множества (плохих) регулярных выражений и заменяли:

@staticmethod
def fix_special_char2(string):
    if isinstance(string, str):
        string = string.replace("'", ' ')
        string = string.replace('\u00e2\u0080\u0099', " ")
        string = string.replace('\u00c3\u00a9', 'e')
        string = string.replace('\u00c3\u00af', 'i')
        string = string.replace('\u00c3\u0080', 'a')
        string = string.replace('\u00c3\u0087', 'c')
        string = string.replace('\u00c3\u00aa', 'e')
        string = string.replace('\u00c3\u00a0', 'a')
        string = string.replace('\u00e2\u009d\u00a4\u00ef\u00b8\u008f', '<3')
        string = string.replace('\u00c3\u0089', 'e')
        string = string.replace('\u00e2\u0082\u00ac', ' euros')
        string = string.replace('\u00c5\u0093', 'oe')
        string = string.replace('\u00c3\u0082', 'a')
        string = string.replace('\u00c3\u008a', 'e')
        string = string.replace('\u00c3\u0089', 'e')
        string = string.replace('\u00e2\u009d\u00a4', '<3')
        string = string.replace('\u00c3\u0088', 'e')
        string = string.replace('\u00c3\u00a2', 'a')
        string = string.replace('\u00c3\u00b4', 'o')
        string = string.replace('\u00c3\u00a7', 'c')
        string = string.replace('\u00c3\u00a8', 'e')
        string = string.replace('\u00c2\u00b0', '°')
        string = string.replace('\u00c3\u00b9', 'u')
        string = string.replace('\u00c3\u00ae', 'i')
        string = re.sub('[^A-Za-z ]+', ' ', string)
        string = re.sub('\\u00f0(.*){18}', '', string)
        string = re.sub('\\u00f3(.*){18}', '', string)
        string = re.sub('([aeiu])\\1{1,}', '\\1', string)
        string = re.sub('([aA-zZ])\\1{2,}', '\\1\\1', string)
    return string

Но если бы я мог найти правильную кодировку, было бы намного проще и быстрее (и красивее) там также проблема с смайлами, но кажется, что мои регулярные выражения не могут их поймать (особенно когда они закованы в цепочку).

Редактировать: Возможно, это будет дубликат: Facebook JSON плохо закодирован

Вместо предлагаемого :)

  • 0
    @CBroe смотрит на таблицу utf8, \ u00c3 => Ã \ u00a9 => © так как я могу получить 'é' из этого?
  • 0
    Да, вы правы, é должен быть закодирован как \u00e9 . Проверьте stackoverflow.com/questions/26614323/… , который занимается той же проблемой.
Показать ещё 1 комментарий
Теги:
python-3.x
facebook

1 ответ

1
Лучший ответ

Я бы использовал пакет ftfy для решения этой проблемы https://github.com/LuminosoInsight/python-ftfy

>>> from ftfy import fix_text
>>> fix_text(u'Comment il est \u00c3\u00a9go\u00c3\u00afste :s')
'Comment il est égoïste :s'

У меня возникли проблемы с установкой текущей версии, но она работала как прелесть с pip install 'ftfy<5'

  • 0
    Я получил самую новую версию, запустив pip install pytest-runner перед pip install ftfy
  • 0
    Большое спасибо, я посмотрю на это, я пока не отмечаю его как принятый, потому что моя цель скорее понять логику кодировки facebook, чтобы я мог создать простую функцию декодирования, не используя целый модуль, который в этом случае кажется излишним (возможно, функция, которую я ищу, просто похоронена в коде ftfy, я поищу ее)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню