首页 > 解决方案 > 修复 Node Js 中的 Facebook JSON 编码

问题描述

我正在尝试解码您在下载数据时从 Facebook 获得的 JSON。我正在使用节点 JS。数据有很多奇怪的 unicode 转义,这些转义并没有什么意义。例子:

"messages": [
    {
      "sender_name": "Emily Chadwick",
      "timestamp_ms": 1480314292125,
      "content": "So sorry that was in my pocket \u00f0\u009f\u0098\u0082\u00f0\u009f\u0098\u0082\u00f0\u009f\u0098\u0082",
      "type": "Generic"
    }
]

哪个应该解码为So sorry that was in my pocket . 使用fs.readFileSync(filename, "utf8")得到了我So sorry that was in my pocket ððð,这是 mojibake。

这个问题提到它搞砸了latin1编码,你可以编码到latin1然后解码到utf8. 我试图这样做:

import iconv from 'iconv-lite';
function readFileSync_fixed(filename) {
    var content = fs.readFileSync(filename, "binary");
    return iconv.decode(iconv.encode(content, "latin1"), "utf-8")
}
console.log(JSON.parse(readFileSync_fixed(filename)))

但我仍然得到 mojibake 版本。谁能指出我正确的方向?我不熟悉 iconv 在这方面的工作方式。

标签: javascriptnode.jsencodingcharacter-encodingiconv

解决方案


为此有非常简单的解决方案

拳头安装utf8

npm i utf8.

您的代码将如下所示

const fs = require('fs');
const utf8 = require('utf8');
let rawdata = fs.readFileSync('JSON_FILE_NAME');
let data = JSON.parse(rawdata);

for (let i = 0;i < data["messages"].length;i++) {
    if (data["messages"][i]["content"] != undefined) {
        console.log(utf8.decode(data["messages"][i]["content"]))
    }
} 

推荐阅读