Skip to content

TXT

TXT 导入首先检测 UTF-8、GBK、Big5、UTF-16 等编码,再根据章节标题模式拆分卷和章节。

编码检测顺序

按顺序尝试,命中即停止,不做完整的统计学编码猜测:

text
1. 前 3 字节是 EF BB BF          → UTF-8(带 BOM,去掉 BOM 头再解码)
2. 前 2 字节是 FF FE 或 FE FF    → UTF-16(小端/大端)
3. 按 UTF-8(无 BOM)尝试解码
4. 按 GBK(GB18030)尝试解码
5. 按 Big5 尝试解码
6. 都失败则按 ISO-8859-1 兜底,保证至少有可显示内容

超大文件走分块读取时,编码判定只在文件开头做一次,后续分块复用同一编码,不会出现 “前半部分和后半部分用不同编码解码”的情况。

章节识别

识别是"数模式匹配 + 计数投票":分别用 5 种标题模式在全文里数匹配次数,选命中次数最多的 一种,但至少要命中 3 次才采信,否则判定为"无章节",整本按固定长度(默认 5 万字符一段) 切块,而不是不断收窄阈值硬凑出章节。5 种模式的正则大致是:

text
中文章节   ^第[零一二三四五六七八九十百千万\d]+章\s*[^\n]*$      如"第12章 破阵"
中文小节   ^第[零一二三四五六七八九十百千万\d]+节\s*[^\n]*$      如"第三节"
卷章结构   ^(?:第[零一二三四五六七八九十百千万\d]+卷|卷[零一二三四五六七八九十百千\d]+)\s*[^\n]*$
英文章节   ^(?:Chapter|CHAPTER|Chap\.?)\s+[\dIVXivx]+\s*[^\n]*$   如"Chapter 12"
数字标题   ^\d+[\.、\s][^\n]{0,30}$                              如"12. 破阵" "12、破阵"

用户内容不满足规则时可作为单章阅读,不应丢弃正文——“识别不到章节”和“文件损坏”是两种 不同的结果,前者仍然要能正常显示全文。

清洗

  • 统一 CRLF/LF;
  • 保留段落边界;
  • 去除不可见控制字符;
  • 不以简单全局替换破坏正文标点;
  • 替换规则在明确的阅读处理阶段执行。

大文件

大体积 TXT 的解码、分章和分页不能在主线程一次完成。缓存章节内容而不是每次翻页重新读 整本文件。

Readori 使用与开发文档