文本字符数统计 在线工具核心JS实现

简介: 这是一款轻量级在线文本统计工具,支持实时计算字符数、中英文/数字/符号数量、行数、段落、句子、词频等20+指标。输入即响应,一键复制结果,界面简洁直观。

这篇只讲功能层 JavaScript。这个工具的实现方式很直接:用户输入文本后,触发统一统计函数,一次计算出全部指标,再把结果绑定到界面。

在线工具网址:https://see-tool.com/text-character-count
工具截图:
工具截图.png

1. 核心状态

先定义输入文本、统计结果、字符频率三个响应式状态:

import {
    ref } from 'vue'

const inputText = ref('')

const stats = ref({
   
  lines: 0,
  chars: 0,
  chinese: 0,
  english: 0,
  words: 0,
  numbers: 0,
  symbols: 0,
  displayLength: 0,
  fileSize: 0,
  charsNoSpace: 0,
  sentences: 0,
  paragraphs: 0,
  avgWordLen: '0',
  readTime: 0
})

const charFrequency = ref([])

2. 统一统计入口函数

输入框 @input 直接调用 updateStatistics,所有统计都在这个函数里完成:

const updateStatistics = () => {
   
  if (!process.client) return

  const text = inputText.value

  // 行数
  const lines = text ? text.split('\n') : []
  stats.value.lines = lines.length

  // 总字符数
  stats.value.chars = text.length

  // 中文字符数
  const chineseChars = text.match(/[\u4e00-\u9fff]/g) || []
  stats.value.chinese = chineseChars.length

  // 英文字符数
  const englishChars = text.match(/[a-zA-Z]/g) || []
  stats.value.english = englishChars.length

  // 单词数
  const words = text.trim() ? text.trim().split(/\s+/).filter(w => w.length > 0) : []
  stats.value.words = words.length

  // 符号数(排除字母、数字、下划线、空白、中日韩统一表意文字)
  const symbols = text.match(/[^\w\s\u4e00-\u9fff]/g) || []
  stats.value.symbols = symbols.length

  // 数字数
  const numbers = text.match(/[0-9]/g) || []
  stats.value.numbers = numbers.length

  // 显示长度:中文记 2,其它记 1
  let displayLength = 0
  for (const char of text) {
   
    if (/[\u4e00-\u9fff]/.test(char)) {
   
      displayLength += 2
    } else {
   
      displayLength += 1
    }
  }
  stats.value.displayLength = displayLength

  // UTF-8 字节大小
  stats.value.fileSize = new Blob([text]).size

  // 去空白字符数
  stats.value.charsNoSpace = text.replace(/\s/g, '').length

  // 句子数
  const sentences = text.split(/[.!?。!?]+/).filter(s => s.trim().length > 0)
  stats.value.sentences = sentences.length

  // 段落数(空行分隔)
  const paragraphs = text.split(/\n\s*\n/).filter(p => p.trim().length > 0)
  stats.value.paragraphs = paragraphs.length

  // 平均词长
  const avgWordLen = words.length > 0
    ? (words.reduce((sum, w) => sum + w.length, 0) / words.length).toFixed(1)
    : '0'
  stats.value.avgWordLen = avgWordLen

  // 阅读时长(200词/分钟)
  const readTime = Math.ceil(words.length / 200)
  stats.value.readTime = readTime

  updateCharFrequency(text)
}

这段代码把基础统计和派生统计放在同一流程,输入变化时只跑一次主函数,逻辑清晰。

3. 字符频率分析

字符频率的做法是遍历全文,过滤空白,统一小写,最后排序截断:

const updateCharFrequency = (text) => {
   
  if (!text.trim()) {
   
    charFrequency.value = []
    return
  }

  const freq = {
   }
  for (const char of text) {
   
    if (/\S/.test(char)) {
   
      const lower = char.toLowerCase()
      freq[lower] = (freq[lower] || 0) + 1
    }
  }

  const sorted = Object.entries(freq)
    .sort((a, b) => b[1] - a[1])
    .slice(0, 20)
    .map(([char, count]) => ({
    char, count }))

  charFrequency.value = sorted
}

这里 Aa 会被合并统计,更符合实际阅读习惯。

4. 复制统计结果

复制逻辑分两层:优先使用 Clipboard API,不可用时自动降级:

const formatNumber = (num) => num.toLocaleString()

const copyStats = async (t, MessagePlugin) => {
   
  if (!process.client) return

  const statsText = [
    t('textCharacterCount.statsResult'),
    '==================',
    `${
     t('textCharacterCount.lines')}: ${
     formatNumber(stats.value.lines)}`,
    `${
     t('textCharacterCount.chars')}: ${
     formatNumber(stats.value.chars)}`,
    `${
     t('textCharacterCount.chinese')}: ${
     formatNumber(stats.value.chinese)}`,
    `${
     t('textCharacterCount.english')}: ${
     formatNumber(stats.value.english)}`,
    `${
     t('textCharacterCount.words')}: ${
     formatNumber(stats.value.words)}`,
    `${
     t('textCharacterCount.numbers')}: ${
     formatNumber(stats.value.numbers)}`,
    `${
     t('textCharacterCount.symbols')}: ${
     formatNumber(stats.value.symbols)}`,
    `${
     t('textCharacterCount.displayLength')}: ${
     formatNumber(stats.value.displayLength)} (${
     t('textCharacterCount.displayLengthHint')})`,
    `${
     t('textCharacterCount.fileSize')}: ${
     formatNumber(stats.value.fileSize)} ${
     t('textCharacterCount.bytes')}`,
    `${
     t('textCharacterCount.charsNoSpace')}: ${
     formatNumber(stats.value.charsNoSpace)}`,
    `${
     t('textCharacterCount.sentences')}: ${
     formatNumber(stats.value.sentences)}`,
    `${
     t('textCharacterCount.paragraphs')}: ${
     formatNumber(stats.value.paragraphs)}`,
    `${
     t('textCharacterCount.avgWordLen')}: ${
     stats.value.avgWordLen}`,
    `${
     t('textCharacterCount.readTime')}: ${
     stats.value.readTime} ${
     t('textCharacterCount.minutes')}`
  ].join('\n')

  try {
   
    await navigator.clipboard.writeText(statsText)
    MessagePlugin.success(t('textCharacterCount.messages.copySuccess'))
  } catch {
   
    const textarea = document.createElement('textarea')
    textarea.value = statsText
    textarea.style.position = 'fixed'
    textarea.style.opacity = '0'
    document.body.appendChild(textarea)
    textarea.select()

    try {
   
      document.execCommand('copy')
      MessagePlugin.success(t('textCharacterCount.messages.copySuccess'))
    } catch {
   
      MessagePlugin.error(t('textCharacterCount.messages.copyFailed'))
    }

    document.body.removeChild(textarea)
  }
}

5. 示例文本与清空

两个动作都很轻:改值 + 重新统计。

const loadSample = (t, MessagePlugin) => {
   
  const sampleText = `Hello World! 这是一个文本统计分析的示例。

这个工具可以统计文本中的字符数、单词数、行数、句子数和段落数。
同时还能分析字符频率,帮助您了解文本的构成特点。`

  inputText.value = sampleText
  updateStatistics()
  MessagePlugin.success(t('textCharacterCount.messages.sampleLoaded'))
}

const clearText = (t, MessagePlugin) => {
   
  inputText.value = ''
  updateStatistics()
  MessagePlugin.info(t('textCharacterCount.messages.textCleared'))
}

6. 触发方式

输入区直接绑定:

<textarea v-model="inputText" @input="updateStatistics"></textarea>

这种绑定方式保证了“输入即统计”,不需要额外点击计算按钮。

相关文章
|
1天前
|
人工智能 前端开发 Serverless
10 分钟部署 Qwen3!阿里云 FunctionAI 模板实测,成本低至 ¥0.5/小时
通义千问Qwen3正式开源8款混合推理模型,含2款MoE(如Qwen3-235B-A22B)和6款Dense模型(从0.6B到32B),支持119种语言、思考/非思考双模式,在代码、数学等基准测试中表现优异。依托阿里云函数计算FC与FunctionAI平台,提供vLLM/SGLang/Ollama等多种部署方式,开箱即用。
103 30
|
1天前
|
人工智能 前端开发 Serverless
vLLM + SGLang + Ollama 自动适配!阿里云 Qwen3 部署智能选引擎
阿里云Qwen3正式开源8款混合推理模型(含2款MoE、6款Dense),支持119种语言,适配vLLM/SGLang/Ollama。依托函数计算FC与FunctionAI平台,提供模型服务与应用模板两种Serverless部署方式,最低GPU配置即可快速体验。
141 20
|
2天前
|
人工智能 运维 自然语言处理
喂饭级教程:OpenClaw阿里云/本地部署+K8s MCP 配置自动化管理容器集群,打造AI运维助手!
在AIOps领域,OpenClaw的爆火为运维工作带来了新可能——通过AI代理能力对接Kubernetes MCP(Management Communication Protocol),可实现容器集群的自动化监控、故障排查与资源管理。但OpenClaw对MCP的原生支持并不友好,需通过适配MCP客户端、封装专属技能,才能让AI真正接管运维任务。
467 129
|
6天前
|
机器学习/深度学习 算法
标签脏了,模型再牛也白搭:聊聊训练样本标签质量的评估与修正(把信噪比狠狠干上去)
标签脏了,模型再牛也白搭:聊聊训练样本标签质量的评估与修正(把信噪比狠狠干上去)
174 14
|
2月前
|
人工智能 安全 调度
AI工程vs传统工程 —「道法术」中的变与不变
本文从“道、法、术”三个层面对比AI工程与传统软件工程的异同,指出AI工程并非推倒重来,而是在传统工程坚实基础上,为应对大模型带来的不确定性(如概率性输出、幻觉、高延迟等)所进行的架构升级:在“道”上,从追求绝对正确转向管理概率预期;在“法”上,延续分层解耦、高可用等原则,但建模重心转向上下文工程与不确定性边界控制;在“术”上,融合传统工程基本功与AI新工具(如Context Engineering、轨迹可视化、多维评估体系),最终以确定性架构驾驭不确定性智能,实现可靠价值交付。
464 41
AI工程vs传统工程 —「道法术」中的变与不变
|
1天前
|
人工智能 JSON 自然语言处理
VTJ.PRO 架构首度揭秘:40 + 工具加持,AI 如何从 “嘴强王者” 变身 “代码执行者”?
VTJ.PRO采用“Agent+Skills”智能体架构,让AI从聊天机器人升级为能主动思考、调用40+开发技能的“开发搭档”。通过分层管道实现多模态输入理解、增量代码更新、流式推理与多模型协同决策,提升效率200%,准确率达98.7%。
53 20
|
7天前
|
人工智能 运维 API
2026年阿里云无影云电脑+本地部署OpenClaw(Clawdbot)+Skills集成小白喂饭级教程
2026年,AI自动化工具迎来全民普及,OpenClaw(原Clawdbot、Moltbot)凭借“零代码入门、全场景适配、轻量化运维”的核心优势,成为小白用户搭建专属AI助手的首选。而阿里云无影云电脑的专属一键部署方案,更是彻底打破了传统部署的技术壁垒,无需手动配置环境、编写复杂命令,依托云端算力实现7×24小时稳定运行,搭配本地部署的灵活便捷,再加上丰富的Skills生态插件,让小白也能轻松解锁“自然语言指令驱动全流程自动化”的强大能力。
225 18
|
2月前
|
人工智能 关系型数据库 Serverless
2 天,用函数计算 AgentRun 爆改一副赛博朋克眼镜
2 天将吃灰的 Meta 眼镜改造成“交警Copilot”:通过阿里云函数计算 AgentRun 实现端-管-云协同,利用 Prompt 驱动交通规则判断,结合 OCR 与数据库查询,打造可动态扩展的智能执法原型,展现 Agent 架构在真实场景中的灵活与高效。
373 45

热门文章

最新文章