You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript如何正确统计文本域中英文及孟加拉语Unicode字符数量

JavaScript 实现Unicode标准字符计数(支持孟加拉语等复杂文字)

误差原因

JavaScript 字符串基于UTF-16编码,内置的length属性统计的是UTF-16码元的个数,而非用户可见的标准Unicode字符数量。孟加拉语这类复杂文字大量存在「基础字符+组合附加符号」的结构,单个用户可见的字符会占用多个UTF-16码元,部分特殊字符还会用到UTF-16代理对,因此直接用length统计会出现明显误差。

解决方案

要得到符合Unicode标准的字符计数,需统计用户感知的字形簇(即单个可见字符,包含基础字符和其绑定的所有组合标记),可以使用ECMA标准内置的Intl.SegmenterAPI实现,该API专门用于文本边界拆分,对多语言兼容性极强。

代码示例

你提供的示例文本测试代码如下:

// 待统计的孟加拉语混合文本
const targetText = `"#NAME#কে সিলেক্ট করার জন্য ধন্যবাদ। প্রেসক্রিপশনটি ফোনে পেতে "যত্ন" এপ ডাউনলোড করুন: rebrand.ly/zn5im2k  আপনি ঠিক টাইম এ চলে আসবেন। ডাক্তার আপনার জন্য অপেক্ষা করবে। ঠিক টাইম এ না আসলে আপনার টাকা লস হবে। পরে আমাদের কিছু বলতে পারবেন না। পুরোটাই আপানার দায়িত্ব হবে। আমাদের জানান দরকার আমরা আপনার সাথে যোগাযোগ করব রাত"`;

// 原方法统计UTF-16码元:结果为313
console.log(targetText.length);

// 统计Unicode码点数量(未合并组合标记)
console.log([...targetText].length);

// 统计字形簇数量:符合Unicode标准,结果为238
// 第一个参数为语言代码,孟加拉语填'bn',混合多语言可填undefined
const segmenter = new Intl.Segmenter('bn', { granularity: 'grapheme' });
const unicodeCharCount = [...segmenter.segment(targetText)].length;
console.log(unicodeCharCount);

兼容性说明

Intl.Segmenter支持Chrome 87+、Firefox 115+、Safari 14.1+、Node.js 16+及以上版本环境。如果需要兼容老旧环境,可使用第三方字形拆分工具库实现相同效果。

内容的提问来源于stack exchange,提问作者Faisal ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:39:05