Кодировать неправильно сформированные эмодзи в python - PullRequest
0 голосов
/ 10 февраля 2020

РЕДАКТИРОВАТЬ

У меня есть текстовый файл, содержащий предложения, включая смайлики, которые я не могу правильно обработать.

В моем csv-файле содержатся следующие предложения:

  • Привет, что вам нужно, чтобы вы получили доступ к документу unicode-d83d \ ude02

  • Aurel ie Gouverneur voir meme la lechée peut étre unicode-d83d \ ude02unicode-d83d \ ude02unicode-d83e \ udd2e

  • Мелан ie Ham meme ce prendre photo c unicode-d83e \ udd23

Мой код:

df_test=pd.read_csv("myfile.csv", sep=';',index_col=None, encoding="utf-8")

for item, row in df_test.iterrows():
    print(repr(row["Message"]))
    s=row["Message"]
    s = re.sub(r'unicode-([0-9a-f]{4})',lambda m: chr(int(m.group(1),16)),s)
    s = s.encode('utf16','surrogatepass').decode('utf16')

Печатные результаты:

'Je suis sur que certaines personnes vont faire la file pour toucher cette borne unicode-d83d\\ude02'
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-40-e3c423a15acd> in <module>
      5     s=row["Message"]
      6     s = re.sub(r'unicode-([0-9a-f]{4})',lambda m: chr(int(m.group(1),16)),s)
----> 7     s = s.encode('utf16','surrogatepass').decode('utf16')

UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 162-163: illegal UTF-16 surrogate

Возможно, проблема связана с кодировкой когда я загружаю CSV в кадре данных, но я не знаю, как решить эту проблему ...

1 Ответ

0 голосов
/ 10 февраля 2020

Текст представляет собой комбинацию экранирования Юникода и пользовательского синтаксиса. Это будет декодировано, как описано, путем захвата шестнадцатеричных значений двух escape-кодов, затем форматирования их в JSON -форматированную пару суррогатов и предоставления этому модулю преобразования в правильную кодовую точку Unicode.

#coding:utf8
import re
import json

sentences = [r'Je suis sur que certaines personnes vont faire la file pour toucher cette borne unicode-d83d\ude02',
             r'Aurelie Gouverneur voir même la lechée peut être unicode-d83d\ude02unicode-d83d\ude02unicode-d83e\udd2e',
             r'Mélanie Ham même ce prendre en photo avec unicode-d83e\udd23']

def surrogates_to_unicode(m):
    upper = int(m.group(1),16)
    lower = int(m.group(2),16)
    return json.loads(f'"\\u{upper:04x}\\u{lower:04x}"')

for s in sentences:
    s = re.sub(r'unicode-([0-9a-f]{4})\\u([0-9a-f]{4})',surrogates_to_unicode,s)
    print(s)
Je suis sur que certaines personnes vont faire la file pour toucher cette borne ?
Aurelie Gouverneur voir même la lechée peut être ???
Mélanie Ham même ce prendre en photo avec ?
...