建议35:获取字节长度
String对象的length属性能够返回字符串的长度,不管字符是单字节,还是双字节,都作为一个来计算。因此,要获取字符串的字节长度,必须通过手工计算获取,这里介绍两种方法。
1)第一种方法是利用循环结构枚举每个字符,并根据字符的字符编码,判断当前字符是单字节还是双字节,然后递加字符串的字节数。
- String.prototype.lengthB = function( ){
- var b = 0, l = this.length;
- if( l ){
- for( var i = 0; i < l; i ++ ){
- if(this.charCodeAt( i ) > 255 ){
- b += 2;
- }else{
- b ++ ;
- }
- }
- return b;
- }else{
- return 0;
- }
- }
- var s = "String对象长度";
- alert(s.lengthB()); // 14
在检测字符是否为双字节或单字节时,方法也有多种,这里提供两种思路(代码如下): - for( var i = 0; i < l; i ++ ){
- var c = this.charAt( i );
- if ( escape( c ).length > 4 ) {
- b += 2;
- }else if( c != "r" ) {
- b ++ ;
- }
- }
或者使用正则表达式进行字符编码验证: - for( var i = 0; i < l; i ++ ){
- var c = this.charAt( i );
- if ( /^[u0000-u00ff]$/.test(c) ) {
- b ++ ;
- }else {
- b += 2;
- }
- }
2)第二种方法是利用正则表达式把字符串中双字节字符临时替换为两个字符,然后调用length属性获取临时字符串的长度。 - String.prototype.lengthB = function(){
- var s = this.replace( /1/g, "**" );
- return s.length;
- }
这种方法比较简洁,但执行速度相对较慢,因为需要两次遍历字符串,即调用replace()方法时一次,使用length属性时一次。而第一种方法只进行一次字符串遍历。
提示:String对象的length属性是只读属性,这与Array的length属性不同。不过,与数组相同,字符串可以使用下标来定位单个字符在字符串中的位置,其中第一个字符的下标值为0,最后一个字符的下标值为length–1。字符串中的字符是不能够被for in循环枚举的。运算符delete也不能删除字符串中指定位置的字符。
- x00-xff ↩