用JavaScript计算在UTF-8下存储字符串占用字节数


Posted in Javascript onAugust 08, 2013

最近和JavaScript纠缠上了。

遇到这么一个问题,数据库的字符集为UTF-8的,要在页面上使用JavaScript验证输入的文本用UTF-8存储时占用字节长度。JavaScript的String对象有length属性,但是这个计算的是字符数,不是字节数(问题总是翻来覆去的,记得当年玩Delphi的时候,还得写程序计算字符串的字符数,因为Delphi中String的length是字节数...)。偷懒一点的办法是将验证代码中最大长度设置为数据库中对应字段的长度的1/3,但是这样准确来说有点不合适。

所以想办法在JavaScript中判断在UTF-8下存储的String的字节数,在网上找到很多关于Unicode介绍的文档,最重要的是字符编码数值对应的存储长度:

UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx (1字节)
0080 - 07FF 110xxxxx 10xxxxxx (2字节)
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx (3字节)

于是代码如下:
[

function mbStringLength(s) { 
var totalLength = 0; 
var i; 
var charCode; 
for (i = 0; i < s.length; i++) { 
charCode = s.charCodeAt(i); 
if (charCode < 0x007f) { 
totalLength = totalLength + 1; 
} else if ((0x0080 <= charCode) && (charCode <= 0x07ff)) { 
totalLength += 2; 
} else if ((0x0800 <= charCode) && (charCode <= 0xffff)) { 
totalLength += 3; 
} 
} 
//alert(totalLength); 
return totalLength; 
}

实际上,0x0080到0x07ff之间的字符很少会在实际用户输入中用到。
Javascript 相关文章推荐
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
Aug 16 Javascript
在Google 地图上实现做的标记相连接
Jan 05 Javascript
js如何准确获取当前页面url网址信息
Sep 13 Javascript
深入理解React中es6创建组件this的方法
Aug 29 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
Nov 28 Javascript
js实现的xml对象转json功能示例
Dec 24 Javascript
bootstrap下拉菜单使用方法解析
Jan 13 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
Nov 21 Javascript
Vue2 添加数据可视化支持的方法步骤
Jan 02 Javascript
详解vue中this.$emit()的返回值是什么
Apr 07 Javascript
详细分析vue表单数据的绑定
Jul 20 Javascript
JavaScript继承的三种方法实例
May 12 Javascript
Jquery chosen动态设置值实例介绍
Aug 08 #Javascript
extjs两个tbar问题探讨
Aug 08 #Javascript
JS实现随机数生成算法示例代码
Aug 08 #Javascript
判断是否安装flash player及当前版本的JS代码
Aug 08 #Javascript
js 为label标签和div标签赋值的方法
Aug 08 #Javascript
JS模拟自动点击的简单实例
Aug 08 #Javascript
动态改变div的z-index属性的简单实例
Aug 08 #Javascript
You might like
set_include_path在win和linux下的区别
2008/01/10 PHP
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
探讨php中header的用法详解
2013/06/07 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
JavaScript基础重点(必看)
2016/07/09 Javascript
js轮播图代码分享
2016/07/14 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
Python中实现三目运算的方法
2015/06/21 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
pip安装python库的方法总结
2019/08/02 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
彪马日本官网:PUMA日本
2019/01/31 全球购物
设计模式的基本要素是什么
2014/04/21 面试题
研究生毕业自我鉴定范文
2014/03/27 职场文书
聘用意向书范本
2014/04/01 职场文书
厂区绿化方案
2014/05/08 职场文书
家长反馈意见及建议
2015/06/03 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL