文档章节

JS计算字符串所占字节数

bosscheng
 bosscheng
发布于 2015/08/04 17:12
字数 674
阅读 48
收藏 3

背景

js是使用Unicode编码的。而Unicode的实现有N种,其中用的最多的就是UTF-8和UTF-16。

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 四个字节。

一开始认为既然页面用的是UTF-8编码,那么存入localStorage的字符串,应该也是用UTF-8编码的。但后来测试发现,明明计算出的size是不到5MB,存入localStorage却抛异常了。想了想,页面的编码是可以改的。如果localStorage按照页面的编码存字符串,不就乱套了?浏览器应该都是使用UTF-16编码的。用UTF-16编码计算出5MB的字符串,果然顺利写进去了。超过则失败了。


/**
     * 计算字符串所占的内存字节数,默认使用UTF-8的编码方式计算,也可制定为UTF-16
     * UTF-8 是一种可变长度的 Unicode 编码格式,使用一至四个字节为每个字符编码
     * 
     * 000000 - 00007F(128个代码)      0zzzzzzz(00-7F)                             一个字节
     * 000080 - 0007FF(1920个代码)     110yyyyy(C0-DF) 10zzzzzz(80-BF)             两个字节
     * 000800 - 00D7FF 
       00E000 - 00FFFF(61440个代码)    1110xxxx(E0-EF) 10yyyyyy 10zzzzzz           三个字节
     * 010000 - 10FFFF(1048576个代码)  11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz  四个字节
     * 
     * 注: Unicode在范围 D800-DFFF 中不存在任何字符
     * {@link http://zh.wikipedia.org/wiki/UTF-8}
     * 
     * UTF-16 大部分使用两个字节编码,编码超出 65535 的使用四个字节
     * 000000 - 00FFFF  两个字节
     * 010000 - 10FFFF  四个字节
     * 
     * {@link http://zh.wikipedia.org/wiki/UTF-16}
     * @param  {String} str 
     * @param  {String} charset utf-8, utf-16
     * @return {Number}
     */
    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;
    }

本文转载自:http://www.alloyteam.com/2013/12/js-calculate-the-number-of-bytes-occupied-by-a-string/

bosscheng
粉丝 80
博文 303
码字总数 95443
作品 0
南京
前端工程师
私信 提问
Node.js使用Buffer类处理二进制数据(二)

Buffer类的方法 (1)isBuffer()方法:该方法可以用于判断一个对象是否为一个Buffer类的实例对象。程序示例: 程序运行截图: (2)byteLength()方法:该方法可以计算一个指定字符串的字节数。程...

同Young不同样
2018/08/12
10
0
优化 JavaScript 执行[转]

JavaScript 经常会触发视觉变化。有时是直接通过样式操作,有时是会产生视觉变化的计算,例如搜索数据或将其排序。时机不当或长时间运行的 JavaScript 可能是导致性能问题的常见原因。您应当...

行列
2018/07/05
0
0
为Web应用程序提速的50条秘技

快速响应网络请求。 避免重定向。排名前1000的网站中,63%使用了重定向。如果不执行重定向的话,页面速度可以提高10%。 避免Meta-refresh。世界上14%的URL使用了Meta-refresh。 尽可能通过C...

knots
2012/12/12
120
2
细说JavaScript数据类型及转换

细说JavaScript数据类型及转换 JavaScript数据类型 1.Boolean(布尔) 布尔:(值类型)var b1=true;//布尔类型 2.Number(数字) 数值:(值类型)var n1=3.1415926;//数值类型 n1.toFixed...

开元中国2015
2015/07/13
105
1
JavaScript闪电入门教程

如需在 HTML 页面中插入JavaScript,请使用

材大难为用
01/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CUBA-Platform应用切换数据库

修改文件位置如图:

微小宝
31分钟前
5
0
封装axios

1、创建一个server目录,在该目录下创建index.js文件 2、配置axios: import axios from 'axios'let loadingInstance = null //这里是loading//使用create方法创建axios实例export co......

Bing309
31分钟前
3
0
删除链表中重复的节点

解题思路: 我们每次都判断当前结点的值与下一个节点的值是否重复 如果重复就循环寻找下一个不重复的节点,将他们链接到——新链表的尾部(其实就是删除重复的节点) public ListNode delete...

Garphy
32分钟前
4
0
被吹上天的云桌面真的好用的吗,过来人告诉你答案

自从云桌面诞生以来它就是大家非常关注的一个话题,而关于对云桌面的宣传和赞美更是从来没有停止过的,有人说它是未来办公的首要选择,传统PC终将被它所替代,而更多的则是说使用云桌面能如何...

GZASD
36分钟前
5
0
JAVA浏览器控件JxBrowser v7.3上线!最新API文档打包带走!

JxBrowser(点击下载)是将基于Chromium的浏览器与Java应用程序集成,以处理和显示HTML5,CSS3,JavaScript,Flash等。 近日,JxBrowser v7.3发布上线,支持最新macOS Catalina,支持Java13,...

mnrssj
38分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部