aardio 文档

textkit.utf16:UTF-16LE 文件编辑

textkit.utf16 操作文件,不操作传入的内存文本。适用于已确认使用 UTF-16LE(codepage=1200)的 Windows 工具 Unicode 日志、文本输出和配置文件。Windows 中“Unicode”并不总是指 UTF-16LE;请先确认来源,不要仅凭文件名或扩展名推断编码。

编码与 BOM 规则

  1. 新建文件默认写入 UTF-16LE BOM(FF FE),便于 Windows 工具识别。新建空文本只有 2 字节 BOM。
  2. 读取不把文件开头的 BOM 作为正文,不影响第一行匹配和行号。
  3. 编辑或覆盖已有文件,保留原来的有/无 BOM 状态;零字节原文件按无 BOM 空文本处理,不擅自增加 BOM。
  4. bom 是读取及成功写操作结果中的布尔字段,不是可设置参数。不提供 codepage、encoding、bom 或 compile 参数。
  5. 只支持 UTF-16LE,不猜测编码、不自动切换 UTF-16BE/UTF-32,也不修复乱码。带 FE FF BOM 的 UTF-16BE 文件明确拒绝。
  6. 拒绝奇数字节、不配对的代理码元及正文中的 U+0000,避免转换器用替换字符悄悄修复原文。正常 UTF-16 零字节不受影响;emoji、扩展汉字和合法的 U+FFFD 均可使用。
  7. 无 BOM 文件不能写入以 U+FEFF/U+FFFE 开头的正文,否则会与 BOM 混淆;这种修改会被拒绝,不会静默丢字或改变端序。有 BOM 文件允许正文以这些字符开头,读取只去掉最外层文件 BOM。

本库不是编码转换或二进制文件修复工具。覆盖前也会验证原文件,不能用 save 绕过错误编码保护。

四个文件入口

所有入口都接收单个参数表,成功和失败都返回结果表,首先检查 ok。

入口 用途 参数
read 有界 UTF-8 视图,供 AI 查看、定位 path, startLine, lineCount, maxBytes, lineNumbers
patch 精确 SEARCH/REPLACE 补丁 path, patches, backup, dryRun, previewMaxBytes
edit 行、锚点、区间及批量字面编辑 path 加 edit_text_file 的编辑字段,不接受 compile
save 新建或明确全文覆盖,不追加 path, content, backup, dryRun

未知或不适用的编辑参数会被拒绝;不编译或执行文件。

读取 Unicode 日志

import textkit.utf16;
return textkit.utf16.read({
    path = "/logs/unicode.log";
    startLine = 1;
    lineCount = 80
});

默认 startLine=1、lineCount=120、maxBytes=20000、lineNumbers=true。

分页只限制输出,内部仍完整读取和解码文件。 本库不是流式大日志读取器或 tail 工具。持续追加的日志可能读到半个码元或半个代理对,此时返回 invalid_text,不会自动补字节或忽略尾部。

精确补丁

import textkit.utf16;
var patches = "<<<<<<< SEARCH
[信息] 开始处理
=======
[信息] 开始构建
>>>>>>> REPLACE";

return textkit.utf16.patch({
    path = "/logs/unicode.log";
    patches = patches;
    dryRun = true
});

确认预览后去掉 dryRun 或设为 false 再提交。补丁中的中文等内容是普通 UTF-8,不要手工转成 UTF-16,也不要包含文件 BOM。

语义与 patch_text_file 一致:

结构化编辑

import textkit.utf16;
return textkit.utf16.edit({
    path = "/logs/unicode.log";
    operation = "replace";
    oldText = "旧提示";
    newText = "新提示";
    expectedCount = 2;
    dryRun = true
});
operation 定位字段 写入字段
replace oldText newText
insertBefore / insertAfter anchor newText
replaceBetween beginAnchor, endAnchor newText
deleteBetween beginAnchor, endAnchor 不传 newText
replaceLines startLine,可选 endLine, expectedOldText newText

新建或全文覆盖

import textkit.utf16;
return textkit.utf16.save({
    path = "/logs/unicode.log";
    content = '[信息] 开始处理\r\n[信息] 处理完成 😀\r\n'
});

content 为 UTF-8 字符串,落盘才转 UTF-16LE。新文件带 BOM,已有文件保留 BOM 状态;空字符串表示空文本。既不追加,也不统一换行、不自动创建父目录。控制字符在 aardio 中用单引号,例如 '\r\n'。

已有文件的局部修改优先 patch/edit;read 展示结果不能当作 save 的完整内容来源。

返回结果与文件保护

写接口常见字段:

previewMaxBytes 默认 1024,范围 0~4096,0 禁止文本回显。预算按 UTF-8 计算,仅限制回显,不限制实际编辑数量。诊断候选只供定位,不能授权模糊写入。

文件提交规则沿用 textkit.ansi:

  1. backup 默认 true,备份名为 <path>.utf16.bak.<时间戳>.<随机后缀>,备份不经过转码。
  2. dryRun 无备份或暂存;无字节变化不写入。patch/edit 无文本变化时直接保留原字节。
  3. 同目录独占创建暂存文件,写入、刷新、字节校验后提交,不先截断目标。
  4. 提交前复查原始字节,有变化则取消。这不是跨进程锁,复查与替换之间仍有短竞争窗口,不承诺多文件事务或断电持久性。
  5. 已有文件通过 ReplaceFileW 替换,新文件移动提交且不覆盖并发创建的目标。backup=false 也先保留恢复原件,成功后才删除;未删除的备份仍返回 backupPath。
  6. 特殊提交故障可能返回 recoveryRequired/backupPath/stagedPath;此时停止编辑,先检查和恢复,不要盲目重试。

备份恢复使用 io.copy(backupPath,targetPath) 原样复制。不要让 Autos 的 UTF-8 文本编辑或回滚工具处理 UTF-16 文件及其备份。 恢复前应确认目标没有需要保留的新修改。

编辑日志时建议先停止日志写入,或创建稳定副本;本库不会锁住日志生产进程,也不会把它改成日志清理服务。

Markdown 格式