代码之家  ›  专栏  ›  技术社区  ›  Maxime

facebook消息的未知编码[重复]

  •  2
  • Maxime  · 技术社区  · 7 年前

    我已经从facebook请求并下载了所有的messenger数据,我想解析返回的json以进行一些语言分析。

    我的问题是,因为我是法国人,所以我的大部分对话都是用法语进行的,而且有很多特殊的字符(微笑也一样):

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

    下面是一个例子:在messenger中它拼写:

    “注释il est goste:s”

    但是如果我使用unicode或utf-8解码unicode字符,我得到的结果是:

    “注释il est goste”

    当我试图将它们写入控制台时,它会与UnicodeEncodeError一起崩溃。

    到目前为止,我的尝试包括很多(坏的)regex和replace:

    @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 badly encoded

    而不是提议的:)

    1 回复  |  直到 7 年前
        1
  •  2
  •   James    7 年前

    我会用这个包裹 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'

    推荐文章