JavaScript/Objekte/String/fromCharCode
Wie im einleitenden Artikel zum Datentyp String beschrieben, wird ein Zeichen in JavaScript als vorzeichenloser 16-bit Wert codiert, und eine Zeichenkette ist ein Array aus solchen Codes. Die verwendene Zeichencodierung ist Unicode.
Die Methode fromCharCode() dient dazu, eine Zeichenkette aus einer Folge von Codenummern zu erzeugen.
let wert = String.fromCharCode(num1[, ...[, numN]])
Die Methode kann folgende Parameter haben:
-
num1
: eine kommaseparierte Liste von Zahlen aus dem Wertebereich 0 - 65535.
Sie gibt eine Zeichenkette zurück, die sich aus den Zeichen mit den angegebenen Codenummern zusammensetzt.
fromCodePoint()
ist eine Methode des globalen Objekts String und muss daher auf diesem Objekt aufgerufen werden.Inhaltsverzeichnis
Unicode-Zeichen außerhalb der BMP
Mit fromCharCode
lassen sind nur die Unicode-Zeichen der Basic Multilingual Plane darstellen. Die Zeichen der übrigen Ebenen müssen, um in einem JavaScript-String gespeichert werden zu können, als UTF-16 Surrogatpaare codiert werden. Idealerweise tun Sie das nicht selbst, sondern verwenden die dafür vorgesehene Methode String.fromCodePoint.
Surrogatbildung "von Hand"
Hat das gewünschte Unicode-Zeichen eine Nummer über 65535
, muss es zunächst in zwei Surrogate genannte UTF-16-Zeicheneinheiten umgewandelt werden. Möchte man beispielsweise das Symbol Sternschnuppe 🌠
kodieren, das die Unicode-Nummer 127776
hat, ermittelt man die Surrogatzeichen wie folgt:
let codepoint = 127776 - 65536; // Surrogate codieren nur die Ebenen ab 1
let lowPart = codePoint & 0x003ff; // Anteil für High Surrogate
let highPart = (codePoint & 0xffc00) >> 10); // Anteil für Low Surrogate
var shootingstar = String.fromCharCode(0xd800 + highPart, 0xdc00 + lowPart);
Im ersten Schritt wird 65536 abgezogen. Unicode hat 17 Ebenen (von 0 bis 16), was mit 20 Bits nicht darstellbar ist. Die Ebene 0 braucht aber keine Surrogate, daher kann man die Codes der Ebenen 1-16 um 65536 nach unten verschieben und kommt nun wieder mit 20 Bits aus.
Aus dem Ergebnis werden nun die beiden 10-Bit Bereiche herausgelöst, die als Surrogatzeichen verschlüsselt werden sollen. Das Beispiel verwendet den & Operator (logisches AND), mit dem sich Bitbereiche ausmaskieren lassen, sowie die Maskenwerte 0x003ff (was der Binärzeichenfolge 0000 0000 0011 1111 1111 entspricht) und 0xffc00 (das ist 1111 1111 1100 0000 0000). Die höherwertigen 10 Bits werden nach der Herausmaskierung noch um 10 Bitstellen nach rechts geschoben, dazu dient der >> Operator. Das Ergebnis sind zwei Werte im Bereich von 0 bis 1023.
Die beiden Zeichenbereiche für Surrogatpaare umfassen jeweils 1024 Zeichen. Die Surrogatzeichen für den höherwertigen Bit-Anteil beginnen bei 55296, oder 0xD800; die Surrogatzeichen für den niederwertigen Teil bei 56320 (oder 0xDC00). Die ermittelten 10-Bit Anteile werden zum Startwert dazuaddiert, und man erhält das jeweilige Surrogatzeichen. Aber, wie gesagt, String.fromCodePoint(127776)
ist heute in jedem Browser verfügbar, eine manuelle Codierung ist nicht mehr notwendig.
Anwendungsbeispiel
var elem = document.getElementById('button');
elem.addEventListener('click', zeichen);
function zeichen() {
var test = String.fromCharCode(65, 66, 67);
var ausgabe = document.getElementById('ausgabe');
ausgabe.innerHTML = test;
}
Im Beispiel wird mit String.fromCharCode()
die Zeichenkette "ABC" erzeugt und in der Variablen test
gespeichert. Die Zeichenkette kommt dadurch zustande, dass 65
die dezimale Zeichennummer für A
in der Unicode-Codetabelle ist, 66
derjenige für B
und 67
der für C
. Im Beispiel wird das Ergebnis zur Kontrolle ausgegeben.
function init() {
var elem = document.getElementById('button');
elem.addEventListener('click', umwandlung);
}
function umwandlung() {
var eingabeElement = document.getElementById('unicode');
var zahl = eingabeElement.value;
var zeichen = String.fromCharCode(zahl);
eingabeElement.value = '';
ausgabe(zeichen);
}
function ausgabe(text){
var ausgabe = document.getElementById('ausgabe');
ausgabe.innerHTML = text;
}
document.addEventListener('DOMContentLoaded', init);
Weblinks
- ECMAScript 2015 (6th Edition, ECMA-262): String.fromCharCode()
- MDN: String.fromCharCode()
umwandlung()
aufgerufen. Dort wird der Wert des Eingabefeldes mit der idunicode
ausgelesen und umgewandelt. Anschließend wird der Wert des Eingabefelds zurückgesetzt und das Unicodezeichen ausgegeben.