用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 相关文章推荐
Jquery如何实现点击时高亮显示代码
Jan 22 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
Apr 07 Javascript
jquery实现简单实用的打分程序实例
Jul 23 Javascript
node.js require() 源码解读
Dec 13 Javascript
AngularJS利用Controller完成URL跳转
Aug 09 Javascript
jQuery实现联动下拉列表查询框
Jan 04 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
Jun 26 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
Sep 14 Javascript
在vue项目中使用sass的配置方法
Mar 20 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
Feb 12 Javascript
vue.js中使用echarts实现数据动态刷新功能
Apr 16 Javascript
js作用域及作用域链工作引擎
Jul 07 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
php 运行效率总结(提示程序速度)
2009/11/26 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
一个javascript图片阅览组件
2010/11/09 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
详解Python如何生成词云的方法
2018/06/01 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
便捷提取python导入包的属性方法
2018/10/15 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
python 对xml解析的示例
2021/02/27 Python
大学生开西餐厅创业计划书
2014/02/01 职场文书
开业庆典主持词
2014/03/21 职场文书
服务标语口号
2014/07/01 职场文书
计划生育证明书写要求
2014/09/17 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
Java实现简易的分词器功能
2021/06/15 Java/Android
python turtle绘图命令及案例
2021/11/23 Python
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang