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

如何在JS中实现类似PHP mb_strlen的字符长度检测?

在JavaScript中实现类似PHP mb_strlen的字符长度检测

嘿,这个坑我之前踩过!你说得没错,JavaScript里直接用$(".textarea").val().length得到的是UTF-16代码单元的数量,而不是实际的Unicode字符数——比如一个中文汉字或者emoji表情,会被算成2个长度,这和PHP的mb_strlen(默认按Unicode字符计数)的行为完全不一样。

下面给你几个实用的解决方案,按易用性和兼容性排序:

方法1:用ES6的Array.from()(最推荐)

Array.from()可以正确识别所有Unicode字符(包括emoji、中文、特殊符号),把字符串转换成由单个字符组成的数组,数组的长度就是我们要的字符数:

const inputVal = $(".textarea").val();
const charLength = Array.from(inputVal).length;

这个方法简洁易懂,兼容性也很好(除了IE,现在大部分项目都已经放弃IE支持了),完全能覆盖绝大多数场景。

方法2:用正则表达式拆分字符串

如果你的项目还需要兼容IE,可以用这个正则方案,它能匹配UTF-16的代理对(就是那些占2个代码单元的字符)和单个字符:

const inputVal = $(".textarea").val();
const charLength = inputVal.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]|./).length - 1;

原理是用正则把每个独立的Unicode字符拆分出来,最后数组长度减1(因为split会在末尾多一个空元素)。不过这个写法不如Array.from()直观,维护起来稍麻烦。

方法3:用Intl.Segmenter(处理复杂字符场景)

如果你的需求涉及到更复杂的字符(比如带声调的拼音组合、语言特定的连字、组合字符),可以用现代浏览器支持的Intl.Segmenter API,它能按用户视觉感知的“单个字符”来计数:

const inputVal = $(".textarea").val();
// 按中文语境的 grapheme(视觉字符)分段
const segmenter = new Intl.Segmenter('zh-CN', { granularity: 'grapheme' });
const segments = Array.from(segmenter.segment(inputVal));
const charLength = segments.length;

这个API的兼容性稍晚一些(Chrome 87+、Firefox 86+支持),但处理复杂字符的能力是最强的。


内容的提问来源于stack exchange,提问作者Quyen Anh Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:22:09