首页 > 解决方案 > Facebook 在数据导出的 JSON 文件中使用什么编码?

问题描述

我已经使用Facebook 功能下载了我的所有数据。生成的 zip 文件包含 JSON 文件中的元信息。问题是这些 JSON 文件中字符串中的 unicode 字符以一种奇怪的方式转义。

以下是此类字符串的示例:

"nejni\u00c5\u00be\u00c5\u00a1\u00c3\u00ad bod: 0 mnm Ben\u00c3\u00a1tky\n"

当我尝试使用 javascript 解析字符串JSON.parse()并将其打印出来时,我得到:

"nejnižší bod: 0 mnm Benátky\n"

虽然它应该是

"nejnižší bod: 0 mnm Benátky\n"

我可以看到这\u00c5\u00be应该以某种方式对应,ž但我无法弄清楚一般模式。

到目前为止,我已经能够弄清楚这些字符:

'\u00c2\u00b0' : '°',
'\u00c3\u0081' : 'Á',
'\u00c3\u00a1' : 'á',
'\u00c3\u0089' : 'É',
'\u00c3\u00a9' : 'é',
'\u00c3\u00ad' : 'í',
'\u00c3\u00ba' : 'ú',
'\u00c3\u00bd' : 'ý',
'\u00c4\u008c' : 'Č',
'\u00c4\u008d' : 'č',
'\u00c4\u008f' : 'ď',
'\u00c4\u009b' : 'ě',
'\u00c5\u0098' : 'Ř',
'\u00c5\u0099' : 'ř',
'\u00c5\u00a0' : 'Š',
'\u00c5\u00a1' : 'š',
'\u00c5\u00af' : 'ů',
'\u00c5\u00be' : 'ž',

那么这个奇怪的编码是什么?有没有可以正确解码的已知工具?

标签: jsonfacebook

解决方案


感谢 Jen 的出色问题和 Shawn 的评论。

基本上,facebook 似乎采用了 unicode 字符串表示的每个单独字节,然后导出为 JSON,就好像这些字节是单独的 Unicode 代码点一样。

我们需要做的是获取每个六重奏的最后两个字符(例如c3from \u00c3),将它们连接在一起并作为 Unicode 字符串读取。

这就是我在 Ruby 中的做法(参见要点):

require 'json'
require 'uri'

bytes_re = /((?:\\\\)+|[^\\])(?:\\u[0-9a-f]{4})+/

txt = File.read('export.json').gsub(bytes_re) do |bad_unicode|
  $1 + eval(%Q{"#{bad_unicode[$1.size..-1].gsub('\u00', '\x')}"}).to_json[1...-1]
end

good_data = JSON.load(txt)

我们捕获了bytes_re所有错误的 Unicode 字符序列。

然后对于每个序列,将 '\u00' 替换为 '\x'(例如\xc3),在其周围加上引号"并使用 Ruby 的内置字符串解析,以便将\xc3\xbe...字符串转换为实际字节,稍后将在 JSON 中保留为 Unicode 字符或通过该#to_json方法正确引用。

[1...-1]是删除由插入的引号#to_json

我想解释代码,因为问题不是特定于 ruby​​ 的,读者可能会使用另一种语言。

我想有人可以用一个足够丑陋的sed命令来做到这一点..


推荐阅读