文本字符数统计 在线工具核心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月前
|
安全 JavaScript
文本字符数统计 在线工具分享
专为内容创作者设计的在线字数统计工具!支持实时统计中/英文、数字、空格等字符数,无需注册、不传数据,隐私安全。适配公众号、小红书、作业、简历等多场景,手机电脑即开即用。
544 7
|
21天前
|
人工智能 弹性计算 数据可视化
部署OpenClaw有哪些成本?附OpenClaw低成本部署指南
OpenClaw(“养龙虾”)是一款开源AI代理框架,可自动化文件处理、工作流与消息管理。本文详解其部署成本:软件免费,云服务器低至68元/年,阿里云百炼新用户享7000万Token免费额度,并提供一键图形化部署指南。
618 32
|
1月前
|
存储 C语言 内存技术
C语言深度解析:大小端字节序——多字节数据的底层存储规则
大小端指CPU对多字节数据在内存中的存放顺序:大端高字节存低地址,小端反之。x86/ARM默认小端,网络字节序统一为大端。跨平台、网络通信、二进制协议开发中必须显式处理字节序转换,否则数据解析必错。
661 138
|
11天前
|
Java 大数据 双11
一张图看懂 Java 能干什么——从淘宝下单到双11抢货,背后都是它
本文专为Java零基础小白打造,用通俗比喻讲清Java本质(“万能翻译官”)、跨平台特性及核心优势;解析其在电商、支付等真实场景的应用;破除“Java已死”误区,结合数据说明其持续强势;并给出清晰入门路径与实用学习建议,助你科学起步。
一张图看懂 Java 能干什么——从淘宝下单到双11抢货,背后都是它
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
大模型应用:医疗视角看脑电图新应用:大模型让脑电波直观的表达.79
本文介绍脑电图(EEG)与大模型融合的前沿应用:无需开刀,仅通过头皮电极采集脑电信号,即可实时解码“想喝水”“想说话”等大脑意图,并转换为自然语言文字。该技术突破传统诊断边界,已在渐冻症沟通、神经康复和脑机交互中落地,兼具无创性、实时性与临床实用性。
101 17
|
7天前
|
人工智能 弹性计算 关系型数据库
阿里云企业新用户定义及专属优惠政策解读
阿里云面向企业新用户推出多重专属优惠:需完成企业实名认证、无历史付费记录、同一主体仅享一次。涵盖38元/年起的轻量服务器、199元/年u1实例、5亿算力补贴、最高4万元AI抵扣金及10万元出海资源包,助力中小企业降本增效、快速上云。
92 12
|
18天前
|
机器学习/深度学习 存储 缓存
大模型架构算力对比:Decoder-only、Encoder-Decoder、MoE深度解析.71
本文深入解析三大主流大模型架构(Decoder-only、Encoder-Decoder、MoE)的算力消耗差异,聚焦注意力机制复杂度、参数量与计算密度三大维度。通过公式推导、代码模拟与可视化图表,揭示MoE稀疏激活的显著节算优势及瓶颈,剖析长文本场景下的“平方级算力黑洞”成因,并提供面向不同场景的架构选型建议。
341 20
|
7天前
|
人工智能 弹性计算 自然语言处理
阿里云学生算力包:大学生上云练手、做毕设、玩 AI 的全能方案
阿里云推出“学生算力包”,19元起享灵活按小时抵扣的云资源,支持一键部署AI简历、个人网站等实战项目;深度联动清华、浙大等数十所高校,提供课程、实训营与赛事支持,助力学生低成本入门AI开发与云实践。
118 9
|
13天前
|
数据采集 人工智能 缓存
ModelEngine思想落地指南:用“智能体 + 插件”构建可复用AI应用.76
ModelEngine是一种AI应用开发范式,通过角色化智能体分工、插件化工具集成与双模式(低代码+代码)开发,解决重复造轮子、流程碎片化、技术门槛高等痛点,实现高效、灵活、可复用的AI应用构建。
125 13
|
25天前
|
人工智能 并行计算 监控
大模型应用:拆解大模型算力需求:算力是什么?怎么衡量?如何匹配?.64
本文系统解析大模型算力核心概念:从基础定义(类比工厂效率)、核心指标(FLOPS、精度影响、显存带宽)到模型-硬件匹配公式与实战优化(量化、多卡分片、参数调优),覆盖RTX 4090/A100等主流显卡适配策略,助你精准选型、高效部署。
614 25

热门文章

最新文章

下一篇
开通oss服务