摘要:使用编码,该编码使用一个比特的编码单元来表示大部分常见的字符,使用两个代码单元表示不常用的字符高位编码单元。因此返回值可能与字符串中实际的字符数量不相同。
String.length:
该属性返回字符串中字符编码单元的数量。JavaScript 使用 UTF-16 编码,该编码使用一个 16 比特的编码单元来表示大部分常见的字符,使用两个代码单元表示不常用的字符(高位编码单元)。因此 length 返回值可能与字符串中实际的字符数量不相同。MDN => String.length
高位编码单元 是使用一对(低位编码(lower valued))代理伪字符("surrogate" pseudo-characters)来表示,从而构成一个真正的字符。String.prototype.charCodeAt()
function strLen ( str ) { var len = 0, ret = 0, i = 0, code, nextCode; if ( str == null ) return ret; str = String( str ); len = str.length; if ( len == 0 ) return ret; for (;i < len; i++ ) { code = str[i].charCodeAt(0); if ( code >= 0xD800 && code <= 0xDBFF ) { nextCode = str[i + 1].charCodeAt(0); if ( nextCode >= 0xDC00 && nextCode <= 0xDFFF ) i++; } ret++; } return ret; } var str = "?"; str.length; // 2 strLen( str ); // 1
// ES6方法
function codePointLength (text) { var result = text.match(/[sS]/gu); return result ? result.length : 0; }
编译后:
function codePointLength (text) { var result = text.match(/(?:[ -uD7FFuE000-uFFFF]|[uD800-uDBFF][uDC00-uDFFF]|[uD800-uDBFF](?![uDC00-uDFFF])|(?:[^uD800-uDBFF]|^)[uDC00-uDFFF])/g); return result ? result.length : 0; };
or
// ES6 function length(str) { return [...str].length; }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/82466.html
摘要:没有直接使用语言传统的字符串表示以空字符串结尾的字符数组,而是构建了一种名为简单动态字符串的抽象类型,并将用作的默认字符串表示。对比字符串,有几大优点常数复杂度获取字符串长度杜绝缓冲区溢出减少修改字符串时所需的内存重分配次数。 Redis 没有直接使用 C 语言传统的字符串表示(以空字符串结尾的字符数组),而是构建了一种名为简单动态字符串(simple dynamic string)的...
摘要:功能产品需求需要限制字符长度为。中文个字符英文个字符考虑场景中文问题光标定位问题字符串截取问题。获取设置完后的长度获取原光标后有几个字符设置光标位置参考文献 功能 产品需求:input 需要限制字符长度为 10。(中文 2 个字符英文 1 个字符)考虑场景:input 中文问题、光标定位问题、字符串截取问题。 实现思路 实现上述需求需监听 3 个事件:input composition...
阅读 3338·2023-04-26 03:05
阅读 1458·2019-08-30 13:09
阅读 1907·2019-08-30 13:05
阅读 886·2019-08-29 12:42
阅读 1385·2019-08-28 18:18
阅读 3446·2019-08-28 18:09
阅读 512·2019-08-28 18:00
阅读 1712·2019-08-26 12:10