Signatur
Beschreibung
encodeInto() ist die speichersparende Variante von TextEncoder.prototype.encode(). Statt bei jedem Aufruf ein neues Uint8Array anzulegen, schreibt die Methode die UTF-8-Bytes in einen Puffer, den du selbst bereitstellst. Das ist besonders nützlich, wenn du viele Strings hintereinander kodierst, einen festen Puffer wiederverwenden willst oder direkt in den Speicher von WebAssembly (WebAssembly.Memory) bzw. in einen SharedArrayBuffer schreiben möchtest.
Der Rückgabewert ist ein Objekt mit zwei Eigenschaften: read gibt an, wie viele UTF-16-Codeeinheiten des Quell-Strings verarbeitet wurden, written gibt an, wie viele Bytes im Ziel geschrieben wurden. Ist der Zielpuffer zu klein, bricht die Kodierung vorher ab – aber nie mitten in einem Zeichen. Über read kannst du den Rest des Strings in einem weiteren Durchgang (etwa in einen neuen Puffer) kodieren.
Um sicherzugehen, dass der gesamte String passt, braucht der Puffer im schlimmsten Fall string.length * 3 Bytes, denn jede UTF-16-Codeeinheit ergibt höchstens drei UTF-8-Bytes (Surrogatpaare: 2 Codeeinheiten → 4 Bytes). Möchtest du an einer bestimmten Stelle im Puffer beginnen, übergibst du eine Teilansicht mit subarray().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | Der zu kodierende Text. Nicht-Strings werden zu einem String umgewandelt; einzelne (ungepaarte) Surrogate werden als U+FFFD (EF BF BD) kodiert. |
|
| $uint8Array Pflicht | Uint8Array | Zielpuffer, in den die UTF-8-Bytes ab Index 0 geschrieben werden. Für einen Versatz eine Ansicht mit buffer.subarray(offset) übergeben. Andere TypedArrays führen zu einem TypeError. |
Rückgabewert
read (Anzahl verarbeiteter UTF-16-Codeeinheiten des Quell-Strings) und written (Anzahl geschriebener Bytes im Zielpuffer).Beispiele
Grundlegende Nutzung mit ausreichend großem Puffer
const encoder = new TextEncoder();
const text = 'Grüße';
const buffer = new Uint8Array(text.length * 3);
const { read, written } = encoder.encodeInto(text, buffer);
console.log(read, written);
console.log(buffer.subarray(0, written));
Zu kleiner Puffer – Abbruch an einer Zeichengrenze
const encoder = new TextEncoder();
const buffer = new Uint8Array(4);
// 'ä' braucht 2 Bytes, '😀' braucht 4 Bytes (2 Codeeinheiten)
const result = encoder.encodeInto('aä😀', buffer);
console.log(result);
// Rest des Strings ermitteln
console.log('Nicht kodiert:', 'aä😀'.slice(result.read));
Mehrere Strings hintereinander in einen Puffer schreiben
const encoder = new TextEncoder();
const buffer = new Uint8Array(64);
let offset = 0;
for (const word of ['Hallo', ' ', 'Welt', '!']) {
const { written } = encoder.encodeInto(word, buffer.subarray(offset));
offset += written;
}
const decoded = new TextDecoder().decode(buffer.subarray(0, offset));
console.log(offset, decoded);
String in WebAssembly-Speicher schreiben
const memory = new WebAssembly.Memory({ initial: 1 }); // 64 KiB
const encoder = new TextEncoder();
const writeString = (str, ptr) => {
const view = new Uint8Array(memory.buffer, ptr, str.length * 3);
const { written } = encoder.encodeInto(str, view);
return written; // Länge für die Wasm-Funktion
};
const len = writeString('Überweisung', 1024);
console.log(len);
// Wichtig · Fallstricke
- Puffergröße:
string.lengthreicht bei Nicht-ASCII-Zeichen nicht. Sicher iststring.length * 3. Prüfe nach dem Aufruf immerread === string.length, sonst wurde gekürzt – ohne Fehler oder Warnung. - Kein Nullterminator: Es wird kein abschließendes
0-Byte geschrieben. Bytes hinterwrittenbleiben unverändert und können alte Daten enthalten. Nutze deshalb immersubarray(0, written). readzählt UTF-16-Codeeinheiten, keine Unicode-Zeichen. Ein Emoji zählt als 2. Deshalb pasststring.slice(read)genau.- Nur UTF-8:
TextEncoderkann ausschließlich UTF-8 erzeugen; andere Kodierungen werden nicht unterstützt. - Wasm-Speicher: Wird
WebAssembly.Memoryvergrößert (grow()), werden vorhandene Ansichten ungültig (Länge 0). Lege dieUint8Array-Ansicht daher erst direkt vor dem Aufruf an. - Kompatibilität: Verfügbar in Chrome 74+, Firefox 66+, Safari 14.1+, Edge 79+ und Node.js 12.11+ (global); auch in Web Workern. In älteren Umgebungen auf
encode()plusUint8Array.prototype.set()ausweichen.