将\ u00f0 \ u009f \ u0098 \ u008a之类的Facebook json文件序列转换为表情符号字符

时间:2019-01-07 00:25:22

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

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

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

(最终,我将使用其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文件中正确提取数据,包括表情符号?

1 个答案:

答案 0 :(得分:0)

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

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

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] = decodeFBString(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"
        }
    ]
}