js获取字符串字节长度

你还认为一个中文字节长度是2吗?[align=center][/align]

一般项目中从前台js到后台java、数据库都是统一采用uft-8编码的,一般情况下在数据库中对每个字段都做了长度限制,所以在编写代码的过程中需要对js和java中的参数长度进行校验,否则在数据录入的时候难免会出错。因为js是一种若数据类型语言,没有将字符串直接转换成byte的方法,所以在校验字符byte长度时难免有人会直接将中文或某些特殊字符按2个长度计算,其实这样是不对的,看了下面的规则后可以去试一下。
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,可以表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII相容,使用一至四个字节为每个字符编码。

其编码规则如下:
1.字符代码在000000 – 00007F之间的,用一个字节编码;
2.000080 – 0007FF之间的字符用两个字节;
3.000800 – 00D7FF 和 00E000 – 00FFFF之间的用三个字节,注: Unicode在范围 D800-DFFF 中不存在任何字符;
4.010000 – 10FFFF之间的用4个字节。

而UTF-16 则是定长的字符编码,大部分字符使用两个字节编码,字符代码超出 65535 的使用四个字节,如下:
1.000000 – 00FFFF 两个字节;
2.010000 – 10FFFF 四个字节。

附上js计算byte长度的代码:

/**
*
*/
var sizeof = function(str, charset)
{   
var total = 0,        charCode,        i,        len;   
charset = charset ? charset.toLowerCase() : '';   
if(charset === 'utf-16' || charset === 'utf16')
{       
for(i = 0, len = str.length; i < len; i++)
{           
charCode = str.charCodeAt(i);           
if(charCode <= 0xffff)
{               
total += 2;           
}
else
{               
total += 4;           
}       
}   
}
else
{       
for(i = 0, len = str.length; i < len; i++)
{           
charCode = str.charCodeAt(i);           
if(charCode <= 0x007f)
{               
total += 1;           
}else if(charCode <= 0x07ff)
{               
total += 2;           
}
else if(charCode <= 0xffff)
{               
total += 3;           
}else
{               
total += 4;           
}       
}   
}   
return total;
}

function test()
{
alert("byte size==" + sizeof("test字符长度【】"))
}

测试结果: byte size==22

再用java测试一下:
public static void main(String[] args) {
String str = "test字符长度【】";
byte[] bts = null;
try {
bts = str.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("byte size ==" + bts.length);
}
}
测试结果:byte size ==22

证明这是一致的吧,不死心的话再看看在什么情况下中文是2个字节;

public static void main(String[] args) {
String str = "test字符长度【】";
byte[] bts = null;
try {
bts = str.getBytes("gb2312");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("byte size ==" + bts.length);
}
}
测试结果:byte size ==16

在数据库中绝对不会以gb2312的编码格式存储字段,所以字符长度计算错误了的话赶紧改吧

你可能感兴趣的:(js)