String.prototype.toWellFormed()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Oktober 2023 browserübergreifend verfügbar.
Die Methode toWellFormed() von String-Werten gibt einen String zurück, in dem alle einzelstehenden Surrogate des ursprünglichen Strings durch das Unicode-Ersatzzeichen U+FFFD ersetzt wurden.
Syntax
toWellFormed()
Parameter
Keine.
Rückgabewert
Ein neuer String, der eine Kopie des ursprünglichen Strings ist, wobei alle einzelstehenden Surrogate durch das Unicode-Ersatzzeichen U+FFFD ersetzt wurden. Wenn str wohlgeformt ist, wird dennoch ein neuer String zurückgegeben (im Wesentlichen eine Kopie von str).
Beschreibung
Strings in JavaScript sind UTF-16-codiert. Die UTF-16-Codierung verwendet sogenannte Surrogatpaare, die im Abschnitt UTF-16-Zeichen, Unicode-Codepunkte und Graphemcluster ausführlich erläutert werden.
toWellFormed() durchläuft die Codeeinheiten des Strings und ersetzt jedes einzelstehende Surrogat durch das Unicode-Ersatzzeichen U+FFFD �. Dadurch ist der zurückgegebene String wohlgeformt und kann in Funktionen verwendet werden, die wohlgeformte Strings erwarten, beispielsweise encodeURI. Im Vergleich zu einer eigenen Implementierung ist toWellFormed() effizienter, da JavaScript-Engines direkt auf die interne Darstellung von Strings zugreifen können.
Wenn nicht wohlgeformte Strings in bestimmten Kontexten verwendet werden, etwa mit TextEncoder, werden sie automatisch mit demselben Ersatzzeichen in wohlgeformte Strings umgewandelt. Auch bei der Darstellung einzelstehender Surrogate wird das Ersatzzeichen angezeigt (eine Raute mit einem Fragezeichen darin).
Beispiele
>toWellFormed() verwenden
const strings = [
// Lone leading surrogate
"ab\uD800",
"ab\uD800c",
// Lone trailing surrogate
"\uDFFFab",
"c\uDFFFab",
// Well-formed
"abc",
"ab\uD83D\uDE04c",
];
for (const str of strings) {
console.log(str.toWellFormed());
}
// Logs:
// "ab�"
// "ab�c"
// "�ab"
// "c�ab"
// "abc"
// "ab😄c"
Fehler in encodeURI() vermeiden
encodeURI löst einen Fehler aus, wenn der übergebene String nicht wohlgeformt ist. Dies lässt sich vermeiden, indem Sie den String zuerst mit toWellFormed() in einen wohlgeformten String umwandeln.
const illFormed = "http://hfffhd3dea44e9a2d46b4s9o6vkx0nu5xu69kv.ffgi.hlju.cwkeji.cn/search?q=\uD800";
try {
encodeURI(illFormed);
} catch (e) {
console.log(e); // URIError: URI malformed
}
console.log(encodeURI(illFormed.toWellFormed())); // "http://hfffhd3dea44e9a2d46b4s9o6vkx0nu5xu69kv.ffgi.hlju.cwkeji.cn/search?q=%EF%BF%BD"
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-string.prototype.towellformed> |