文本截断工具
支持按字符数(Unicode 码点)、字节数(UTF-8 编码)、行数三种方式截断文本。 可选自定义省略号、保留单词边界避免截断单词。使用 Array.from 正确处理 Emoji 代理对, 使用 TextEncoder/TextDecoder 正确处理 UTF-8 多字节字符边界。 适用于摘要生成、输入框字数限制、数据库字段截断、SEO meta description 长度控制等场景。所有处理在浏览器本地完成。
常见问题
按字符数截断和按字节数截断有什么区别?
按字符数(Unicode 码点)截断:每个字符算 1 个单位,无论中英文还是 Emoji。
例如"你好 JS 😊"是 6 个字符。使用 Array.from 按 Unicode 码点遍历,
正确处理 Emoji 等代理对字符。
按字节数(UTF-8 编码)截断:按 UTF-8 编码后的字节总数截断。
中文字符通常占 3 字节,英文字符占 1 字节,Emoji 占 4 字节。
例如"你好 JS"的 UTF-8 字节数为 2×3 + 1×3 = 9 字节。
按字节截断适合数据库字段长度限制、网络传输字节预算等场景。
为什么按字符数截断要用 Array.from 而不是 split('')?
JavaScript 字符串的 split('') 按 UTF-16 码元分割,
对于 Emoji(如 😊,码点 U+1F60A)会被拆成两个码元(代理对),导致截断后字符错乱。
Array.from 按 Unicode 码点遍历字符串,将代理对作为一个整体处理,
确保截断位置不会落在代理对中间。这是处理含 Emoji 文本的正确方式。
保留单词边界选项有什么作用?
开启后,截断位置会回退到最近的空格(单词边界),避免在英文单词中间截断。 例如截断 "JavaScript is awesome" 到 10 个字符:关闭选项结果为 "JavaScript"(恰好在空格前);截断到 13 个字符:关闭选项结果为 "JavaScript is", 开启选项会回退到 "JavaScript" 避免截断 "is" 后的空格导致不完整。 对于纯中文文本(无空格分词),该选项不产生影响。
省略号会占用截断长度吗?
会的。省略号本身的字符数(或字节数)会从截断限制中扣除。 例如按字符数截断到 50,省略号 "..."(3 个字符),实际文本截断到 47 个字符后追加 "..."。 自定义省略号同理:省略号 "…"(1 个 Unicode 码点)截断到 50 时,实际文本截断到 49 个字符。 按字节截断时,省略号的 UTF-8 字节数也会从限制中扣除。
按字节数截断如何处理多字节字符?
按字节截断时,如果截断位置恰好落在多字节字符中间(如中文字符的第 2 字节),
会产生无效的 UTF-8 序列。本工具使用 TextDecoder 逐字节回退,
直到截断位置是完整的 UTF-8 字符边界,确保结果始终是有效的字符串。
例如按 4 字节截断"你好"(6 字节),会回退到 3 字节边界,结果为"你"。
这个工具适合哪些使用场景?
① 摘要生成:截断长文本生成文章摘要或预览; ② 输入框字数限制:验证用户输入是否超过长度限制; ③ 数据库字段截断:按字节截断避免超出 VARCHAR(N) 字段限制; ④ SEO meta description:控制 description 标签长度在搜索引擎显示范围内; ⑤ 消息预览:短信、推送通知等场景的文本预览截断; ⑥ 日志截断:截断过长的日志行避免影响阅读。
数据会上传到服务器吗?
不会。本工具完全在浏览器内运行,所有截断处理由 JavaScript 在你本地执行, 不会发送任何输入文本或截断结果到服务器。全程零网络请求,可离线使用。