Rumah >hujung hadapan web >tutorial js >Javascript mengira bilangan bait yang diduduki oleh rentetan dalam petua localStorage_javascript

Javascript mengira bilangan bait yang diduduki oleh rentetan dalam petua localStorage_javascript

WBOY
WBOYasal
2016-05-16 15:35:571277semak imbas

Projek baru-baru ini mempunyai keperluan untuk menggunakan js untuk mengira memori yang diduduki oleh rentetan yang ditulis ke localStorage Seperti yang kita semua tahu, js menggunakan pengekodan Unicode. Terdapat N jenis pelaksanaan Unicode, antaranya UTF-8 dan UTF-16 adalah yang paling biasa digunakan. Oleh itu, artikel ini hanya membincangkan kedua-dua pengekodan ini.

Takrifan berikut diambil daripada Wikipedia (http://zh.wikipedia.org/zh-cn/UTF-8), dengan beberapa pemadaman.

UTF-8 (Format Transformasi Unikod 8-bit) ialah pengekodan aksara panjang boleh ubah untuk Unikod yang boleh mewakili mana-mana aksara dalam standard Unikod dan bait pertama dalam pengekodannya masih serasi dengan ASCII , menggunakan satu hingga empat bait untuk mengekod setiap aksara

Peraturan pengekodan adalah seperti berikut:

Kod aksara antara 000000 – 00007F dikodkan dengan satu bait

Watak antara 000080 – 0007FF menggunakan dua bait;
Gunakan tiga bait antara 000800 – 00D7FF dan 00E000 – 00FFFF Nota: Unicode tidak mempunyai sebarang aksara dalam julat D800-DFFF Gunakan 4 bait antara 010000 – 10FFFF.

UTF-16 ialah pengekodan aksara panjang tetap Kebanyakan aksara menggunakan dua bait untuk mengekod, dan kod aksara yang melebihi 65535 menggunakan empat bait, seperti berikut:

000000 – 00FFFF dua bait; 010000 – 10FFFF empat bait.



Pada mulanya saya fikir memandangkan halaman tersebut dikodkan dalam UTF-8, rentetan yang disimpan dalam localStorage juga harus dikodkan dalam UTF-8. Tetapi ujian kemudian mendapati bahawa saiz yang dikira adalah kurang daripada 5MB, tetapi pengecualian telah dilemparkan apabila menyimpannya ke localStorage. Selepas memikirkannya, pengekodan halaman boleh diubah. Jika localStorage menyimpan rentetan mengikut pengekodan halaman, bukankah ia akan menjadi huru-hara? Semua penyemak imbas harus menggunakan pengekodan UTF-16. Rentetan 5MB telah dikira menggunakan pengekodan UTF-16, dan ia berjaya ditulis. Jika melebihi, ia gagal.

Baiklah, inilah pelaksanaan kod. Peraturan pengiraan adalah seperti yang ditulis di atas Untuk kelajuan pengiraan, dua untuk gelung ditulis secara berasingan.

/**
   * 计算字符串所占的内存字节数,默认使用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;
  }
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn