当字符串中有中文字符的时候在获取字符以及其长度上会有一定的问题。例如
//demo1 var str='谦'; console.log(str.length,str.charAt(0)) // 1 谦 demo2 var s = "
走同样的路,发现不同的人生
1,因为javascript是以utf-16进行编码的,它的长度都是固定的2字节。所以无论是英文字符,还是中文字符还是其他任何字符都会最终转化成16位的编码格式。所以length得到的长度是用来表示该字符的位数来决定的。2,虽然表示英文字符只需要一个字节,但是在javascript中,它是用两个字节表示的,所以length也是1,一般的中文字符是可以通过两个字节表示的,但是有些字,比如"
javascript
MDN 链接
注意,charCodeAt 总是返回一个小于 65,536 的值。这是因为高位编码单元(higher code point)使用一对(低位编码(lower valued))代理伪字符("surrogate" pseudo-characters)来表示,从而构成一个真正的字符。因此,为了查看或复制(reproduce)65536 及以上编码字符的完整字符,不仅需要获取 charCodeAt(i) 的值,也需要获取 charCodeAt(i+1) 的值(如同查看/reproducing 拥有两个字符的字符串一样)
var foo = function() { alert('called'); }; function time(fn,count) { foo = function(){ if(count-- > 0) { fn(this); } }; } time(foo,2)(); foo();//called foo();//called foo();//do nothing
由于字符集的不断扩充,utf-16已经成为变长的字符集。一个字符占2或4个字节,常用汉字均为两个字节。
其四字节字符的构成方式与gbk的双字节字符类似,高位char的一定取值范围表示它跟后面的char共同构成一个字符。
1,因为
javascript
是以utf-16进行编码的,它的长度都是固定的2字节。所以无论是英文字符,还是中文字符还是其他任何字符都会最终转化成16位的编码格式。所以length得到的长度是用来表示该字符的位数来决定的。2,虽然表示英文字符只需要一个字节,但是在javascript中,它是用两个字节表示的,所以length也是1,一般的中文字符是可以通过两个字节表示的,但是有些字,比如"
MDN 链接
由于字符集的不断扩充,utf-16已经成为变长的字符集。一个字符占2或4个字节,常用汉字均为两个字节。
其四字节字符的构成方式与gbk的双字节字符类似,高位char的一定取值范围表示它跟后面的char共同构成一个字符。