字数 (zishu) — 精准字数统计器
> 独立 skill,不依赖 gongcheng。核心脚本 count.py,纯 Python 标准库,无依赖。
> 原则:凡涉及字数,一律以本工具输出为准,AI 自估的字数一律不可信。
一、为什么需要
LLM 看到的文本是 token 序列,不是字符序列。中文 1 个字 ≈ 1 token 还好,
英文一个词会被切碎,标点、空格、数字混合后 AI 数出来的"字数"经常偏差 10%~30%。
用户明确给了字数限制("100 字以内")时,AI 自估交差 = 隐性违约。
本工具 = 把"数字数"从概率行为变成 len() 级确定性计算。
二、调用方式
> $ZISHU = 本 skill 目录下的 count.py。本机为 /root/.trae-cn/skills/zishu/count.py;
> 从 SkillHub 安装后为 <你的skills目录>/zishu/count.py。下同。
# 方式 1: 参数直传(文本无单引号时最简单)
python3 $ZISHU '要统计的文本'
# 方式 2: 文本含单引号/复杂引号 → 写临时文件再 -f(推荐,最稳)
python3 $ZISHU -f /tmp/text.txt
# 方式 3: stdin
echo '要统计的文本' | python3 $ZISHU
# 带字数限制校验(--metric 默认 word_count)
python3 $ZISHU --limit 100 '文本'
python3 $ZISHU --limit 50 --min 30 --metric hanzi '文本'
exit code:0 = 全部 PASS,1 = 有 FAIL(方便脚本化判断)。
三、口径说明(输出 JSON 字段)
| 字段 | 含义 | 适用场景 |
|---|---|---|
chars_total |
总字符数,含空格/换行/标点/emoji(Unicode 码点数) | 用户问"一共多少个字符" |
chars_no_ws |
不含任何空白的字符数 | 用户说"不算空格" |
hanzi |
汉字数(基本区+扩展A-G+〇,不含标点) | 用户问"多少个汉字" |
cn_punct |
中文标点数(。,、;:?!《》……) | 检查标点密度 |
en_words |
英文单词数(don't / well-connected 算 1 词) | 英文词数要求 |
digit_runs |
连续数字串个数("2026年" → 1) | — |
word_count |
字数(最常用)= hanzi + en_words + digit_runs,不含标点不含空格 | 用户说"X字以内"时默认用这个 |
word_count_with_punct |
字数含全部标点 | 用户明确"标点也算字"时 |
punct |
全部标点(中英全角半角) | — |
whitespace |
空白字符数 | — |
lines |
行数(末尾换行不产生空行) | — |
默认口径决策:用户没说口径时用 word_count(贴近 Word"字数"统计)。
用户说"字符数"→ chars_total;说"汉字"→ hanzi;说"标点也算"→ word_count_with_punct。
四、核心工作流:写 → 数 → 改 → 再数(闭环)
凡是带字数要求的写作任务,必须走这个闭环,禁止写完就交:
1. 写出候选文本
2. count.py --limit N 验证(或先无 limit 统计)
3. FAIL 超出 → 删减 → 重新统计(回到 2)
FAIL 还差 → 扩写 → 重新统计(回到 2)
4. PASS → 在回复里引用工具输出的具体数字交付(如"共 96 字(汉字88+数字串2+英文词6)")
注意:
- 改一个字都可能跨过阈值,每次改动后都要重新跑,不要心算增量
- 交付时报告的字数必须是工具输出值,不是估值
- "X字左右"这类软性要求也建议验证(偏差 >20% 就调)
五、边界与已知口径约定
- emoji / 组合字符:按 Unicode 码点计数。一个"👨👩👧"家庭 emoji 是 8 个码点(family emoji 的默认输出口径即如此)。用户问的若是"眼睛看到的字符数"(grapheme),需说明本工具按码点计,必要时单独处理
- 全角空格 U+3000 归空白不归标点
- 〇(U+3007) 归汉字
- 连字符/撇号词(well-known / It's)各算 1 个英文词
- 换行符计入
chars_total与whitespace,不计入其他口径