145 Stimmen

Wie viele Bytes in einem JavaScript-String?

Ich habe einen JavaScript-String, der beim Senden vom Server in UTF-8 etwa 500K groß ist. Wie kann ich seine Größe in JavaScript feststellen?

Ich weiß, dass JavaScript UCS-2 verwendet, was bedeutet, dass 2 Bytes pro Zeichen verwendet werden. Allerdings, hängt das von der JavaScript-Implementierung ab? Oder von der Seitenkodierung oder vielleicht vom Inhaltstyp?

0 Stimmen

Die ungefähre Antwort wäre Länge*Zeichengröße, also liegt deine Schätzung nah.

1 Stimmen

Modernes JavaScript, zum Beispiel ES6, verwendet nicht nur UCS-2, weitere Details hier: stackoverflow.com/a/46735247/700206

106voto

P Roitto Punkte 1133

Sie können das Blob verwenden, um die Größe des Strings in Bytes zu erhalten.

Beispiele:

console.info(
  new Blob(['']).size,                             // 4
  new Blob(['']).size,                             // 4
  new Blob(['']).size,                           // 8
  new Blob(['']).size,                           // 8
  new Blob(['Ich bin ein String']).size,                  // 12

  // aus Premasagars Korrektur von Lauris Antwort für
  // Strings, die einsame Zeichen im Surrogatbereich enthalten:
  // https://stackoverflow.com/a/39488643/6225838
  new Blob([String.fromCharCode(55555)]).size,       // 3
  new Blob([String.fromCharCode(55555, 57000)]).size // 4 (nicht 6)
);

0 Stimmen

Wie importiere ich Blob in Node.js?

14 Stimmen

Ahh, mit Node.js verwenden wir Buffer, zum Beispiel Buffer.from('').length

1 Stimmen

Blob ist jetzt in NodeJS v18 integriert.

87voto

Lauri Oherd Punkte 1343

Diese Funktion gibt die Byte-Größe eines UTF-8-Strings zurück, den Sie ihr übergeben.

function byteCount(s) {
    return encodeURI(s).split(/%..|./).length - 1;
}

Quelle

JavaScript-Engines können intern UCS-2 oder UTF-16 verwenden. Die meisten Engines, von denen ich weiß, verwenden UTF-16, aber egal welche Wahl sie getroffen haben, es ist nur ein Implementierungsdetail, das die Eigenschaften der Sprache nicht beeinflusst.

Die ECMAScript/JavaScript-Sprache selbst gibt jedoch Zeichen gemäß UCS-2 heraus, nicht UTF-16.

Quelle

10 Stimmen

Verwenden Sie stattdessen .split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./). Ihr Ausschnitt funktioniert nicht für Strings, die auf "%uXXXX" codiert sind.

0 Stimmen

Verwendet zur Größenberechnung von WebSocket-Frames, gibt dieselbe Größe für ein String Frame wie die Chrome-Entwicklertools.

3 Stimmen

Verwendet für JavaScript-Zeichenfolgen, die auf s3 hochgeladen wurden. s3 zeigt genau die gleiche Größe an [ (byteCount(s))/ 1024).toFixed(2) + " KiB" ]

73voto

Offirmo Punkte 17432

Wenn Sie node.js verwenden, gibt es eine einfachere Lösung mit Puffern:

function getBinarySize(string) {
    return Buffer.byteLength(string, 'utf8');
}

Es gibt eine npm-Bibliothek dafür: https://www.npmjs.org/package/utf8-binary-cutter (von deinem aufrichtig)

0 Stimmen

Dies gibt 5 für "\x80\u3042" zurück, während Ruby's bytesize 4 zurückgibt (siehe apidock.com/ruby/String/bytesize)

1 Stimmen

@MicaelLevi Hallo, bin kein Experte in Ruby, aber es ist möglich, dass JavaScript und Ruby Zeichenfolgen intern nicht gleich codieren. Siehe andere Antworten auf diese Frage: Ruby muss UTF-8 verwenden, während JavaScript anscheinend UCS-2 verwendet.

1 Stimmen

Es gibt keinen Grund mehr, Buffer zu verwenden. Blob und TextEncoder sind bereits integriert und sind benutzerfreundlicher für verschiedene Umgebungen.

41voto

Christian C. Salvadó Punkte 763569

String-Werte sind gemäß der ECMA-262 3. Edition Spezifikation nicht implementierungsabhängig, jedes Zeichen repräsentiert eine einzige 16-Bit-Einheit von UTF-16-Text:

4.3.16 String-Wert

Ein String-Wert ist ein Element des Typs String und ist eine endliche geordnete Sequenz von null oder mehr 16-Bit nicht-negativen Ganzzahlwerten.

HINWEIS Obwohl jeder Wert normalerweise eine einzelne 16-Bit-Einheit von UTF-16-Text darstellt, legt die Sprache keine Beschränkungen oder Anforderungen an die Werte fest, außer dass sie 16-Bit nicht-negative Ganzzahlen sind.

9 Stimmen

Meine Lesung dieses Abschnitts bedeutet nicht Unabhängigkeit von der Implementierung.

4 Stimmen

UTF-16 wird nicht garantiert, nur die Tatsache, dass die Zeichenfolgen als 16-Bit-Ints gespeichert sind.

0 Stimmen

Es ist nur implementierungsabhängig in Bezug auf UTF-16. Die 16-Bit-Zeichenbeschreibung ist universell.

29voto

Hong Ly Punkte 191

Diese 3 Möglichkeiten verwende ich:

  1. TextEncoder

    new TextEncoder().encode("meinString").length

  2. Blob

    new Blob(["meinString"]).size

  3. Buffer

    Buffer.byteLength("meinString", 'utf8')

0 Stimmen

FYI: Es scheint, dass alle Code-Segmente am Ende eine unpaarige schließende Klammer haben.

2 Stimmen

Es scheint, als ob die TextEncoder-Option mehr als 6 Mal schneller ist: i.ibb.co/QkfsJQN/Screenshot-from-2020-12-20-16-29-27.png

1 Stimmen

Buffer ist das Schlimmste aus Gründen der plattformübergreifenden Umgebung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X