fix(reader): split large txt into chapters (章 as boundaries, 卷 as optgroup labels, pseudo-sections when unmarked) rendered one at a time so the browser stops freezing; decode via strict-UTF-8-then-GB18030 with UTF-16 BOM sniffing to kill mojibake; progress locator {ch,scrollFraction} with old global-fraction fallback
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
// 网络 txt 常是 GBK/GB2312 而服务端一律标 charset=utf-8:先严格试 UTF-8,
|
||||
// 失败回退 GB18030(GBK 超集);UTF-16 靠 BOM 识别。纯逻辑,vitest 覆盖。
|
||||
export function decodeText(buf: ArrayBuffer): string {
|
||||
const b = new Uint8Array(buf);
|
||||
if (b[0] === 0xff && b[1] === 0xfe) return new TextDecoder("utf-16le").decode(b);
|
||||
if (b[0] === 0xfe && b[1] === 0xff) return new TextDecoder("utf-16be").decode(b);
|
||||
try {
|
||||
return new TextDecoder("utf-8", { fatal: true }).decode(b);
|
||||
} catch {
|
||||
return new TextDecoder("gb18030").decode(b);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user