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
相关产品推荐
相关产品推荐

