用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 相关文章推荐
AutoSave/自动存储功能实现
Mar 24 Javascript
jquery实现树形二级菜单实例代码
Nov 20 Javascript
node.js中的events.emitter.once方法使用说明
Dec 10 Javascript
javascript页面倒计时实例
Jul 25 Javascript
关于在Servelet中如何获取当前时间的操作方法
Jun 28 Javascript
ES6新特性之Object的变化分析
Mar 31 Javascript
angular2路由切换改变页面title的示例代码
Aug 23 Javascript
clipboard.js在移动端复制失败的解决方法
Jun 13 Javascript
jquery使用echarts实现有向图可视化功能示例
Nov 25 jQuery
解决Vue router-link绑定事件不生效的问题
Jul 22 Javascript
微信小程序实现底部弹出模态框
Nov 18 Javascript
JavaScript 实现继承的几种方式
Feb 19 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蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
python使用tkinter实现简单计算器
2018/01/30 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
keras实现多种分类网络的方式
2020/06/11 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
函授本科毕业生自我鉴定
2013/10/16 职场文书
酒店门卫岗位职责
2013/12/29 职场文书
服务员自我评价
2014/01/25 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
基层工作经历证明
2015/06/19 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
VUE递归树形实现多级列表
2022/07/15 Vue.js