JavaScript 计算中文字符长度与字节数的多种实现方案
本文详细介绍在 JavaScript 中如何准确计算包含中文、全角符号及英文字符的字符串长度与字节数。针对 JS 原生 length 属性无法区分中英文字符的问题,提供了基于正则匹配、字符编码判断、UTF-8 转换以及 GBK 编码处理等多种代码实现方案,并探讨了不同编码格式(如 UTF-8 与 GBK)对字节数的影响。
JavaScript 中文字符长度计算基础
在 JavaScript 中,所有字符串均为 string 对象,可通过其 length 属性获取长度。然而,无论是中文字符、全角符号还是英文字符,其最小长度单位均被视为 1。这与 PHP 中的 strlen() 函数行为不同,后者能根据编码区分字节长度。
代码如下:
function strlen(str) {
var s = 0;
for(var i = 0; i < str.length; i++) {
if(str.charAt(i).match(/[u0391-uFFE5]/)) {
s += 2;
} else {
s++;
}
}
return s;
} 该函数通过遍历字符串,利用正则表达式匹配全角字符和汉字。若匹配成功,则计为 2 个字符长度;否则计为 1 个字符长度。
代码如下:
<script>
alert (fucCheckLength("中国a"));
function fucCheckLength(strTemp)
{
var i,sum;
sum=0;
for(i=0;i<strTemp.length;i++)
{
if ((strTemp.charCodeAt(i)>=0) && (strTemp.charCodeAt(i)<=255))
sum=sum+1;
else
sum=sum+2;
}
return sum;
}
</script> 执行上述代码将返回结果 5。这里需要注意字符长度与字节长度的区别。字节长度取决于具体的字符编码方式。例如字符串"中国a",在 GBK 或 GB2312 编码下占用 5 个字节;而在 UTF-8 编码下,通常一个汉字占用 3 个字节,总长度则为 7 个字节。
UTF-8 与 GBK 编码下的字节差异
我们可以尝试将所有字符转换为 GBK 编码后再进行操作,具体实例如下:
代码如下:
function Utf8ToUnicode(strUtf8)
{
var bstr = "";
var nTotalChars = strUtf8.length; // total chars to be processed.
var nOffset = 0; // processing point on strUtf8
var nRemainingBytes = nTotalChars; // how many bytes left to be converted
var nOutputPosition = 0;
var iCode, iCode1, iCode2; // the value of the unicode.
while (nOffset < nTotalChars)
{
iCode = strUtf8.charCodeAt(nOffset);
if ((iCode & 0x80) == 0) // 1 byte.
{
if ( nRemainingBytes < 1 ) // not enough data
break;
bstr += String.fromCharCode(iCode & 0x7F);
nOffset ++;
nRemainingBytes -= 1;
}
else if ((iCode & 0xE0) == 0xC0) // 2 bytes
{
iCode1 = strUtf8.charCodeAt(nOffset + 1);
if ( nRemainingBytes < 2 || // not enough data
(iCode1 & 0xC0) != 0x80 ) // invalid pattern
{
break;
}
bstr += String.fromCharCode(((iCode & 0x3F) << 6) | ( iCode1 & 0x3F));
nOffset += 2;
nRemainingBytes -= 2;
}
else if ((iCode & 0xF0) == 0xE0) // 3 bytes
{
iCode1 = strUtf8.charCodeAt(nOffset + 1);
iCode2 = strUtf8.charCodeAt(nOffset + 2);
if ( nRemainingBytes < 3 || // not enough data
(iCode1 & 0xC0) != 0x80 || // invalid pattern
(iCode2 & 0xC0) != 0x80 )
{
break;
}
bstr += String.fromCharCode(((iCode & 0x0F) << 12) |
((iCode1 & 0x3F) << 6) |
(iCode2 & 0x3F));
nOffset += 3;
nRemainingBytes -= 3;
}
else // 4 or more bytes -- unsupported
break;
}
if (nRemainingBytes != 0)
{
// bad UTF8 string.
return "";
}
return bstr;
} 基于正则与编码判断的实现方案
为解决上述问题,本文介绍几种使用 JavaScript 获取中文字符长度的方法。
首先,我们定义一个新的函数 getBytes() 来获取字符串的字节数。在 JavaScript 标准中,该函数并非内置,需手动实现。
代码如下:
String.prototype.getBytes = function() {
var cArr = this.match(/[^x00-xff]/ig);
return this.length + (cArr == null ? 0 : cArr.length);
}
function paramCheck(cur){
if(cur.value.getBytes() > 64){
alert("字符超过64个字符");
return false;
}
return true;
} getBytes 方法利用正则表达式判断字符串中包含非单字节字符(如汉字)的个数,并将这些字符存入数组 cArr。cArr 的长度即为非单字节字符的总数。getBytes 方法返回原始字符串长度加上非单字节字符数,从而得到总的字节长度。
需要注意的是,正则表达式 [^x00-xff] 可能会匹配到某些特殊字符,例如右花括号 } 等。
如果改用 [^u4E00-u9FA5] 来匹配,则无法正确匹配到所有中文字符。
以下是另外几种方法,大家可以测试下:
字符串截取与长度处理扩展
以下是另外两种实现方式:
代码如下:
function _length(str){
var len=0;
for(var i=0;i<str.length;i++){
if(str.charAt(i)'~'){len+=2;}else{len++;}
}
return len;
} 第二种方法:
代码如下:
String.prototype.gblen = function() {
var len = 0;
for (var i=0; i<this.length; i++) {
if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) {
len += 2;
} else {
len ++;
}
}
return len;
}
String.prototype.gbtrim = function(len, s) {
var str = '';
var sp = s || '';
var len2 = 0;
for (var i=0; i<this.length; i++) {
if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) {
len2 += 2;
} else {
len2 ++;
}
}
if (len2 <= len) {
return this;
}
len2 = 0;
len = (len > sp.length) ? len-sp.length: len;
for (var i=0; i<this.length; i++) {
if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) {
len2 += 2;
} else {
len2 ++;
}
if (len2 > len) {
str += sp;
break;
}
str += this.charAt(i);
}
return str;
}
var str1 = '世上最牛的@#%&们 世上最牛的@#%&们';
document.write('str1 = '+ str1 +'
');
document.write('length = '+ str1.gblen() +'
');
document.write('gbtrim(10) = '+ str1.gbtrim(10) +'
');
document.write('gbtrim(10, \'…\') = '+ str1.gbtrim(10, '…') +'
');
document.write('gbtrim(12, \'-\' ) = '+ str1.gbtrim(12, '-') +'
');
// gbtrim(len 截取长度,按英文字节长度计算, s截取后的省略字符,如"…" )
// 备注: 这里中文字符都是当作两个长度来计算的,所以gbtrim中的len为10时,是显示最多5个汉字的。
// 当汉字数大于5时,由于截取后加上"…",所以只显示4个汉字。JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
