【问题标题】:Convert Facebook json file sequences like \u00f0\u009f\u0098\u008a to emoji characters将 Facebook json 文件序列(如 \u00f0\u009f\u0098\u008a)转换为表情符号字符
【发布时间】:2019-06-01 16:38:17
【问题描述】:

我已将我的 Facebook 数据下载为 json 文件。我的帖子的 json 文件包含表情符号,在 json 文件中显示如下:\u00f0\u009f\u0098\u008a。我想解析这个 json 文件并使用正确的表情符号提取帖子。

我找不到将这个 json 文件加载到 json 对象(使用 JavaScript)然后读取(并输出)带有正确表情符号的帖子的方法。

(最终我将使用 WordPress 的 REST API 将这些帖子上传到 WordPress,我已经知道如何去做了。)

我的程序是用 JavaScript 编写的,并使用 nodejs 从命令行运行。我已经使用以下方法解析了文件:

const fs = require('fs')
let filetext = fs.readFileSync(filename, 'utf8')
let jsonObj = JSON.parse(filetext)

但是,当我输出数据时(使用 jsonObj.status_updates.data[0].post 之类的东西),我得到了表情符号的奇怪字符,例如 Happy birthday ├░┬ƒ┬ÿ┬è 而不是 Happy birthday ????。这不是 Windows 10 控制台显示问题,因为我也将输出通过管道传输到文件。

在解析文件之前,我已使用答案Decode or unescape \u00f0\u009f\u0091\u008d to ???? 将 json 文件中的 \uXXXX 序列更改为实际的表情符号。但是,然后JSON.parse 不起作用。它给出了这个信息:

SyntaxError: Unexpected token o in JSON at position 1
    at JSON.parse (<anonymous>)

所以我陷入了困境:如果我在尝试解析 json 文件之前转换了 \uXXXX 序列,那么 JavaScript json 解析器就会出错。如果我不转换 \uXXXX 序列,则 json 对象形式的解析文件不提供正确的表情符号!

如何从 json 文件中正确提取数据,包括表情符号?

【问题讨论】:

    标签: javascript node.js json facebook utf-8


    【解决方案1】:

    我相信您应该能够在 Node.js 中完成所有这些工作,这是一个示例。 我已经使用 Visual Studio Code 对此进行了测试。

    你可以在这里试试:https://repl.it/repls/BrownAromaticGnudebugger

    注意:我已经根据@JakubASuplicki 的非常有用的 cmets 更新了 processMessage,只查看字符串属性。

    index.js

    const fs = require('fs')
    let filename = "test.json";
    let filetext = fs.readFileSync(filename, "utf8");
    let jsonObj = JSON.parse(filetext);
    
    console.log(jsonObj);
    
    function decodeFBString(str) {
        let arr = [];
        for (var i = 0; i < str.length; i++) {
            arr.push(str.charCodeAt(i));
        }
        return Buffer.from(arr).toString("utf8");
    }
    
    function processMessages (messageArray) {
        return messageArray.map(processMessage);
    }
    
    function processMessage(message) {
        return Object.keys(message).reduce((obj, key) => {
            obj[key] = (typeof message[key] === "string") ? decodeFBString(message[key]): message[key];
            return obj
        }, {});
    }
    
    let messages = processMessages(jsonObj.messages);
    console.log("Input: ", jsonObj.messages);
    console.log("Output: ", messages);
    

    test.json

    {
        "participants": [
            {
                "name": "Philip Marlowe"
            },
            {
                "name": "Terry Lennox"
            }
        ],
        "messages": [
            {
                "sender_name": "Philip Marlowe",
                "timestamp_ms": 1546857175,
                "content": "Meet later? \u00F0\u009F\u0098\u008A",
                "type": "Generic"
            },
            {
                "sender_name": "Terry Lennox",
                "timestamp_ms": 1546857177,
                "content": "Excellent!! \u00f0\u009f\u0092\u009a",
                "type": "Generic"
            }
        ]
    }
    

    【讨论】:

    • 好东西。谢谢你。需要注意的一点是,这种方法还删除了 timestamp_ms 值。我设法通过在将messages 传递给processMessages() 之前将毫秒转换为所需的数据格式来解决这个问题。
    • 非常感谢@JakubASuplicki 的信息,我想我们对所有数字属性都做了同样的事情。所以我会添加一个测试来确保我们只转换字符串属性。
    • 那太棒了。我很想看到更新的代码。谢谢!
    • 所以我更新了代码,现在我们检查每个属性的类型,如果它是我们转换的字符串,如果不是我们保持原样。
    • 看起来不错!谢谢你。我最近也在研究它,我还注意到在 Facebook JSON 文件中,GIF 或图片等内容 - 任何带有外部链接的内容都在 array 中。这会在将内容传递给decodeFBString(str) 时导致错误,因为它需要String。我通过在该方法中添加一行来修复它,该行检查str 是否是array - Array.isArray(str),如果不是,那么arr.push(str.charCodeAt(i)) 将运行得很好——否则它会抛出错误。只是觉得在处理现实生活中导出的 FB JSON 文件时可能会有人发现这很有用。
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多