piapia123
zh

按行长度过滤

文本

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

按长度留下或删掉某些行。真正的难点不在过滤,而在长度用哪把尺子量 —— 同一行「中文ab」在三种口径下分别是 4 个字符、8 个字节、6 个显示宽度: · 字符数 —— 你眼里的字数(按字形簇,emoji 算一个) · 字节数 —— UTF-8 编码后占几个字节,数据库字段与接口限长用的正是这个(一个汉字 3 字节) · 显示宽度 —— 排版意义上的宽度(中日韩字符算 2 宽),手机号、身份证这类定宽校验靠它 拿错口径的结果是:过滤条件看着合理、筛出来的行却不对,而且没有任何报错。所以口径必须显式选。宽度表与页面 meta 描述用的是同一张,两处对「多宽」的答案因此永远一致。 「保留」与「删除」是一对对偶选项,不是两个工具:一半人想「留下 5 到 20 字的」,另一半想「把超过 20 字的删掉」,同一套区间配两个方向,两条路都能走。

功能

  • 三种长度口径:字符数、UTF-8 字节数、显示宽度
  • 上下限都是闭区间,上限填 0 表示不限
  • 「保留」与「删除」两个方向,同一套区间通用
  • 字节数用 TextEncoder 算,emoji(4 字节)与扩展区汉字都算得对
  • 显示宽度的表与 meta 描述共用一份,两处口径不会漂移
  • 过滤不改动留下的行:不 trim、不合并空白、不换行尾
  • 下限填得比上限大时直接报错,而不是给一份空结果
  • 全程在浏览器本地计算,内容不上传

使用方法

  1. 粘贴要筛选的文本
  2. 选长度口径:字符数、字节数还是显示宽度
  3. 填下限与上限,选保留还是删除
  4. 结果实时更新,点「复制」取走

常见问题

三种口径差在哪?
拿 `中文ab` 举例:字符数 4(四个字形簇)、字节数 8(两个汉字各 3 字节 + 两个字母各 1 字节)、显示宽度 6(两个汉字各占 2 宽 + 两个字母各占 1 宽)。什么时候用哪个:限数据库字段长度用字节数,限界面显示用显示宽度,数「多少个字」用字符数。
上限填 0 是什么意思?
0 表示不限。原因是输入框里没有「空」这个状态,只能拿一个数当哨兵,而 0 是唯一不会被误认为有效上限的值 —— 没有哪一行是负长度。要注意的是上下限都填 0 就等于不设任何条件:「保留」模式原样输出,「删除」模式则会把所有行都删掉。
为什么不能用字符数代替显示宽度?
因为中文与英文的视觉宽度差一倍。20 个汉字的标题与 20 个英文字母的标题,字符数一样,排版宽度却差接近两倍 —— 按字符数卡出来的「不超过 20」,在中文下会明显超出设计稿。要卡的是「看上去有多宽」,就得用显示宽度。

相关工具