返回

如何从 iOS OTG 备份恢复笔记文本格式?

IOS

如何从 iOS OTG 备份中提取带有格式的笔记文本

背景

从 iOS 设备备份中提取笔记内容时,通常无法获取文本格式,如粗体、斜体或删除线。这使得以原始格式恢复笔记变得困难。

问题

无法从 iOS OTG 备份中提取笔记文本格式,导致无法恢复原始笔记格式。

解决方案

要解决这个问题,需要从 NoteStore.sqlite 数据库中提取和解析笔记格式数据:

提取原始数据

  1. 使用 HexFiend 或 SQLiteBrowser 等工具打开 NoteStore.sqlite 数据库文件。
  2. 查询 ZSFNOTE 表以提取笔记格式数据:
    SELECT
      Z_PK,
      ZATTRIBUTES
    FROM
      ZSFNOTE
    WHERE
      ZTITLE = 'Note Title';
    

解码格式数据

  1. ZATTRIBUTES 列包含 Base64 编码的格式数据。
  2. 使用 base64 解码器解码此数据。

解析格式数据

  1. 解码后的数据包含一个 JSON 对象,其中包含有关笔记格式的信息。
  2. 提取文本范围和类型,范围由 R 字段指定,类型由 T 字段指定:
    • R:文本范围
    • T:文本类型(0 = 普通文本,1 = 粗体,2 = 斜体,3 = 删除线)

提取文本格式

  1. 根据 R 和 T 字段的值,提取文本格式。
  2. 例如,如果 T 字段的值为 1,则文本在 R 字段指定范围内为粗体。

代码示例

import base64

# 提取 ZATTRIBUTES 字段
zattributes = cursor.execute('SELECT ZATTRIBUTES FROM ZSFNOTE WHERE ZTITLE = \'Note Title\'').fetchone()[0]

# 解码 ZATTRIBUTES 数据
decoded_data = base64.b64decode(zattributes)

# 将解码后的数据解析为 JSON
json_data = json.loads(decoded_data)

# 提取文本范围和类型
for item in json_data['R']:
    if item['T'] == 1:
        print('Text between indices {} and {} is bold.'.format(item['R'], item['R'] + item['L']))

提示

  • 使用正确的 NoteStore.sqlite 数据库文件,因为它因 iOS 设备和备份类型而异。
  • 使用正则表达式可以更轻松地解析格式数据。
  • 使用 try-except 块来处理任何异常,例如 JSON 解码错误。

常见问题解答

  1. 我无法找到 NoteStore.sqlite 文件。

    • 该文件位于 iOS 备份的 SQLiteBackup 目录中。
  2. 我无法解码 ZATTRIBUTES 数据。

    • 确保您使用的是正确的 Base64 解码器。
  3. 我无法解析 JSON 数据。

    • 确保您使用的是正确的 JSON 解析器。
  4. 我无法提取文本范围和类型。

    • 使用正确的字段名称(R 和 T)。
  5. 我无法以原始格式恢复笔记。

    • 确保您正确地提取和解析了所有文本格式数据。