Heim > Web-Frontend > js-Tutorial > Hauptteil

Javascript berechnet die Anzahl der von einer Zeichenfolge belegten Bytes in den Tipps von localStorage_javascript

WBOY
Freigeben: 2016-05-16 15:35:57
Original
1228 Leute haben es durchsucht

Ein aktuelles Projekt erfordert die Verwendung von js, um den Speicher zu berechnen, der von einer in localStorage geschriebenen Zeichenfolge belegt wird. Wie wir alle wissen, verwendet js die Unicode-Codierung. Es gibt N Arten von Unicode-Implementierungen, von denen UTF-8 und UTF-16 am häufigsten verwendet werden. Daher werden in diesem Artikel nur diese beiden Kodierungen behandelt.

Die folgende Definition stammt aus Wikipedia (http://zh.wikipedia.org/zh-cn/UTF-8), mit einigen Streichungen.

UTF-8 (8-Bit-Unicode-Transformationsformat) ist eine Zeichenkodierung variabler Länge für Unicode, die jedes Zeichen im Unicode-Standard darstellen kann, und das erste Byte in seiner Kodierung ist immer noch mit ASCII kompatibel, wobei eins bis vier verwendet wird Bytes zum Kodieren jedes Zeichens

Die Codierungsregeln lauten wie folgt:

Zeichencodes zwischen 000000 – 00007F werden mit einem Byte codiert;

Zeichen zwischen 000080 – 0007FF verwenden zwei Bytes;

Verwenden Sie drei Bytes zwischen 000800 – 00D7FF und 00E000 – 00FFFF. Hinweis: Unicode hat keine Zeichen im Bereich D800-DFFF; Verwenden Sie 4 Bytes zwischen 010000 und 10FFFF.


UTF-16 ist eine Zeichenkodierung mit fester Länge. Die meisten Zeichen verwenden zwei Bytes zum Kodieren, und Zeichencodes über 65535 verwenden vier Bytes, wie folgt:

000000 – 00FFFF zwei Bytes; 010000 – 10FFFF vier Bytes.


Zuerst dachte ich, dass die in localStorage gespeicherten Zeichenfolgen auch in UTF-8 codiert sein sollten, da die Seite in UTF-8 codiert ist. Spätere Tests ergaben jedoch, dass die berechnete Größe weniger als 5 MB betrug, beim Speichern in localStorage jedoch eine Ausnahme ausgelöst wurde. Nachdem Sie darüber nachgedacht haben, kann die Kodierung der Seite geändert werden. Wenn localStorage Zeichenfolgen entsprechend der Kodierung der Seite speichert, wäre das dann nicht ein Chaos? Alle Browser sollten die UTF-16-Kodierung verwenden. Die 5-MB-Zeichenfolge wurde mithilfe der UTF-16-Kodierung berechnet und erfolgreich geschrieben. Wenn es überschritten wird, schlägt es fehl.

Okay, hier ist die Code-Implementierung. Die Berechnungsregeln sind wie oben beschrieben. Aus Gründen der Berechnungsgeschwindigkeit werden die beiden for-Schleifen separat geschrieben.

/**
   * 计算字符串所占的内存字节数,默认使用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;
  }
Nach dem Login kopieren
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!