Я запросил и загрузил все мои данные в мессенджерах из 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 плохо закодирован
Вместо предлагаемого :)
Я бы использовал пакет 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'
pip install pytest-runner
перед pip install ftfy
é
должен быть закодирован как\u00e9
. Проверьте stackoverflow.com/questions/26614323/… , который занимается той же проблемой.