Start · Sprachen · JavaScript · Referenz · String.fromCodePoint()

String.fromCodePoint()

Methode

Erzeugt einen String aus einer Folge von Unicode-Codepunkten und unterstützt dabei auch Zeichen außerhalb der BMP wie Emojis (über <code>U+FFFF</code>).

seit JavaScript ES2015 Kategorie: method-property

Signatur

String.fromCodePoint(...codePoints)

Beschreibung

String.fromCodePoint() ist eine statische Methode von String. Sie wird also immer als String.fromCodePoint() aufgerufen und nicht auf einer String-Instanz. Jedes Argument gilt als Unicode-Codepunkt im Bereich 0 bis 0x10FFFF. Die Methode setzt daraus den passenden UTF-16-String zusammen.

Der große Vorteil gegenüber dem älteren String.fromCharCode(): Codepunkte oberhalb von 0xFFFF (Emojis, historische Schriften, mathematische Symbole) werden automatisch in ein Surrogatpaar umgewandelt. Diese Aufteilung müssen Sie nicht selbst berechnen.

Typische Einsatzfälle sind:

  • das Erzeugen von Zeichen aus numerischen Codes, z. B. beim Dekodieren von HTML-Entities wie &#x1F600;,
  • das Zurückwandeln von Codepunkten, die Sie mit codePointAt() gelesen haben,
  • das Erzeugen von Zeichenbereichen, etwa für Flaggen-Emojis aus Ländercodes.

Ungültige Werte führen nicht zu einem stillschweigend falschen Ergebnis, sondern lösen einen RangeError aus.

Parameter

Name Typ Default Beschreibung
$...codePoints number Null oder mehr Unicode-Codepunkte. Jeder Wert muss eine ganze Zahl zwischen 0 und 0x10FFFF sein. Werte, die keine Zahlen sind, werden vorher mit Number() umgewandelt.

Rückgabewert

Typ
string
Beschreibung
Ein String aus den angegebenen Codepunkten. Ohne Argumente ist es der leere String "".

Beispiele

Einfache Zeichen und Emojis erzeugen

console.log(String.fromCodePoint(72, 105));        // "Hi"
console.log(String.fromCodePoint(0x1F600));        // Emoji
console.log(String.fromCodePoint(0x1F600).length); // Surrogatpaar
console.log(String.fromCodePoint());               // leerer String
Hi 😀 2

Numerische HTML-Entities dekodieren

const decodeEntities = (text) =>
  text
    .replace(/&#x([0-9a-f]+);/gi, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))
    .replace(/&#(\d+);/g, (_, dec) => String.fromCodePoint(Number(dec)));

console.log(decodeEntities('Gr&#252;&#223;e &#x1F44B;'));
Grüße 👋

Flaggen-Emoji aus einem Ländercode

const flag = (countryCode) =>
  String.fromCodePoint(
    ...[...countryCode.toUpperCase()].map((c) => 0x1F1E6 + c.charCodeAt(0) - 65)
  );

console.log(flag('de'), flag('AT'), flag('ch'));
🇩🇪 🇦🇹 🇨🇭

Ungültige Codepunkte abfangen

const safeChar = (cp) => {
  try {
    return String.fromCodePoint(cp);
  } catch (err) {
    return `Fehler: ${err.name}`;
  }
};

console.log(safeChar(0x10FFFF + 1));
console.log(safeChar(3.14));
console.log(safeChar(-1));
Fehler: RangeError Fehler: RangeError Fehler: RangeError

// Wichtig · Fallstricke

  • RangeError statt stiller Fehler: Die Methode wirft einen RangeError, wenn ein Wert keine ganze Zahl ist (z. B. 3.14, NaN oder 'abc'), wenn er negativ ist oder wenn er größer als 0x10FFFF ist. String.fromCharCode() kürzt solche Werte dagegen stillschweigend auf 16 Bit.
  • Länge ist nicht gleich Zeichenanzahl: Codepunkte über 0xFFFF ergeben zwei UTF-16-Codeeinheiten, deshalb ist .length dann 2. Zeichen zählen Sie besser mit [...str].length.
  • Einzelne Surrogate: Werte zwischen 0xD800 und 0xDFFF sind erlaubt, ergeben aber einen String mit einzelnen Surrogaten, die für sich allein ungültig sind. Mit str.isWellFormed() (ES2024) können Sie das prüfen.
  • Sehr viele Argumente: Wenn Sie große Arrays per Spread-Syntax übergeben (String.fromCodePoint(...arr)), kann bei sehr vielen Elementen die Grenze für Funktionsargumente überschritten werden. Verarbeiten Sie große Arrays daher in Teilstücken.
  • Kompatibilität: Die Methode wird in allen modernen Browsern und in Node.js ab Version 4 unterstützt. Der Internet Explorer unterstützt sie nicht.