js获取字符串字节长度

[size=x-small][b]你还认为一个中文字节长度是2吗?[/b][/size][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的编码格式存储字段,所以字符长度计算错误了的话赶紧改吧
### JavaScript 中获取字符串长度的方法 在 JavaScript 中,可以通过 `String` 对象的内置属性 `.length` 来获取字符串长度。该方法简单高效,适用于大多数场景。 以下是具体的实现方式: #### 使用 `.length` 属性 `.length` 是一个只读属性,用于返回字符串中的 Unicode 编码单元数量。对于简单的 ASCII 字符(如英文字母、数字),其计数通常是准确的。但对于某些特殊字符(如表情符号或多字节字符),可能会存在偏差[^1]。 ```javascript const str = "Hello, world!"; console.log(str.length); // 输出 13 ``` 如果需要处理多字节字符(如中文或其他复杂字符集),可以采用更复杂的逻辑来计算真实长度。例如,在引用[3]中提供了一种函数 `strLength` 的实现,它通过检测字符编码是否超过 255 来调整最终的结果[^3]。 #### 处理特殊情况下的字符串长度字符串包含非标准字符(如表情符号或扩展字符集合)时,单靠 `.length` 可能无法满足需求。此时可借助正则表达式或其他库工具进行精确统计。例如: ```javascript function getTrueLength(str) { let count = 0; for (let i = 0; i < str.length; i++) { if (/[\u{0}-\u{FFFF}]/.test(str[i])) { count += 1; // 单个字符 } else { count += 2; // 超过基本平面的字符(如表情) } } return count; } const specialStr = "😊你好"; console.log(getTrueLength(specialStr)); // 输出 4 ``` 上述代码片段展示了如何针对不同类型的字符分别计数,并得出更加精准的字符串长度[^2]。 --- ### 总结 - 基础情况下可以直接使用 `.length` 属性快速获得字符串长度。 - 如果涉及复杂字符集,则需额外编写算法以确保准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值