Appearance
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 的解码、分章和分页不能在主线程一次完成。缓存章节内容而不是每次翻页重新读 整本文件。
