我正在尝试解码您下载数据时从 Facebook 获得的 JSON。我正在使用 Node.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"
}
]
应该解码为很抱歉它在我的口袋里😂😂😂
。使用fs.readFileSync(filename, "utf8")
让我很抱歉,它在我的口袋里ððð
,而不是mojibake。
This question提到它搞砸了 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 在这方面的工作原理。
最佳答案
以某种方式解决了...。如果有更好的方法,请告诉我。
所以,这是修改后的函数
readFacebookJson(filename) {
var content = fs.readFileSync(filename, "utf8");
const json = JSON.parse(converted)
return json
}
fixEncoding(string) {
return iconv.decode(iconv.encode(string, "latin1"), "utf8")
}
这不是 readFileSync()
搞砸了,而是 JSON.parse()
。因此,我们像往常一样将文件读取为 utf8,但是,我们需要对现在是 JSON 文件属性的字符串进行 latin1 编码/解码,而不是在解析之前对整个 JSON 文件进行编码/解码。我用 map()
做到了这一点。
messages = readFacebookJson(filename).messages.map(message => {
const toReturn = message;
toReturn.sender_name = fixEncoding(toReturn.sender_name)
if (typeof message.content !== "undefined") {
toReturn.content = fixEncoding(message.content)
}
return toReturn;
}),
这里的问题当然是某些属性可能会丢失。因此,请确保您知道哪些属性包含哪些内容。
关于javascript - 修复 Node Js 中的 Facebook JSON 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57059821/