json - 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' : 'ž',
那么这个奇怪的编码是什么?有没有可以正确解码的已知工具?
解决方案
感谢 Jen 的出色问题和 Shawn 的评论。
基本上,facebook 似乎采用了 unicode 字符串表示的每个单独字节,然后导出为 JSON,就好像这些字节是单独的 Unicode 代码点一样。
我们需要做的是获取每个六重奏的最后两个字符(例如c3
from \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
命令来做到这一点..
推荐阅读
- postgresql - PostgreSQL 查询经过的时间间隔
- c++ - VsCode 的错误曲线是怎么回事?
- laravel - 是否可以在 laravel 的单元测试中传递令牌来检查端点?传递令牌为空但检测到用户
- python - 在分布式工作人员中执行 Dask Graph
- firebase - 这个流是否像我想象的那样工作?
- google-app-engine - 使用 Cloud Domains 注册域
- python - 在同一构建目录中安装期间重复构建 Pip?
- r - 为什么 dev.new() 会打开 RStudioGD- 和 png 设备?
- html - 如何将一个组件中的按钮链接到 reactjs 应用程序中另一个组件中的 div?
- php - PHP ZipArchive 密码不起作用 - 不接受设置密码