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

Pra*_*ful 2 javascript json facebook utf-8 node.js

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

\n\n

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

\n\n

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

\n\n

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

\n\n
const fs = require(\'fs\')\nlet filetext = fs.readFileSync(filename, \'utf8\')\nlet jsonObj = JSON.parse(filetext)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当我输出数据(使用类似jsonObj.status_updates.data[0].post)时,我得到了表情符号的奇怪字符,例如Happy birthday \xe2\x94\x9c\xe2\x96\x91\xe2\x94\xac\xc6\x92\xe2\x94\xac\xc3\xbf\xe2\x94\xac\xc3\xa8而不是Happy birthday 。这不是 Windows 10 控制台显示问题,因为我也将输出通过管道传输到文件。

\n\n

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

\n\n
SyntaxError: Unexpected token o in JSON at position 1\n    at JSON.parse (<anonymous>)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n

Ter*_*nox 7

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

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

注意:我已经按照 @JakubASuplicki 非常有用的注释更新了 processMessage,仅查看字符串属性。

索引.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);
Run Code Online (Sandbox Code Playgroud)

测试.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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)