Ich versuche, jedes Unicode-Zeichen in einer Zeichenfolge zu entfernen, wenn es in den folgenden Bereichen fällt.Entfernen Sie Unicode-Zeichen in verschiedenen Bereichen in Javascript
\uD800-\uDFFF
\u1D800-\u1DFFF
\u2D800-\u2DFFF
\u3D800-\u3DFFF
\u4D800-\u4DFFF
\u5D800-\u5DFFF
\u6D800-\u6DFFF
\u7D800-\u7DFFF
\u8D800-\u8DFFF
\u9D800-\u9DFFF
\uAD800-\uADFFF
\uBD800-\uBDFFF
\uCD800-\uCDFFF
\uDD800-\uDDFFF
\uED800-\uEDFFF
\uFD800-\uFDFFF
\u10D800-\u10DFFF
Als erster Prototyp habe ich versucht, nur Zeichen zu entfernen, innerhalb des ersten Bereichs durch einen regulären Ausdruck in der replace
Funktion.
var buffer = "he\udfffllo world";
var output = buffer.replace(/[\ud800-\udfff]/g, "");
d.innerText = buffer + " is replaced with " + output;
In diesem Fall scheint das Zeichen in Ordnung zu sein.
Allerdings, wenn ich ersetzen, dass mit
var buffer = "he\udfffllo worl\u1dfffd";
var output = buffer.replace(/[\ud800-\udfff\u1d800-\u1dfff]/g, "");
d.innerText = buffer + " is replaced with " + output;
ich etwas Unerwartetes zu sehen. Meine Ausgabe zeigt sich als:
hallo worl᷿fd mit
ersetzt Es gibt zwei Dinge zu beachten:
\u1dfff
zeigt nicht als ein Zeichen up -\u1dff
bekommt konvertiert in ein Zeichen undf
am Ende behandelt es als sein eigenes Zeichen- das Ergebnis ist eine leere Zeichenfolge.
Irgendwelche Vorschläge, wie ich dies erreichen könnte, würde sehr geschätzt werden.
EDIT
Mein Gesamtziel ist es, alle Zeichen zu filtern, die die encodeURIComponent
Funktion ungültig betrachtet. Ich habe einige Tests durchgeführt und festgestellt, dass die obige Liste die Menge der ungültigen Zeichen ist. Zum Beispiel bewirkt der folgende Code, der zuerst 1dfff
in ein Unicode-Zeichen umwandelt, bevor es an encodeURIComponent
übergeben wird, eine Ausnahme, die von der letzteren Funktion ausgelöst wird.
var v = String.fromCharCode(122879);
var uriComponent = encodeURIComponent(v);
ich Teile der Frage bearbeitet, nachdem @Blender darauf hingewiesen, dass ich x
statt u
in meinem Code wurde mit Unicode-Zeichen darzustellen.
EDIT 2
suchte ich meine Technik zum Abrufen der „ungültig“ Unicode weiter reicht, und wie sich herausstellt, wenn Sie String.fromCharacterCode
geben eine Zahl, die größer als 16 Bits ist, wird es schau dir einfach die niedrigsten 16 Bits der Zahl an. Das erklärt das Muster, das ich sah. So wie es sich herausstellt, muss ich mich nur um den ersten Bereich kümmern.
'\ xdfff' als' \ xdf' interpretiert wird, 'f' und' f'. – Blender
Ahh, du hast recht, das erklärt, warum ich in meinem zweiten Versuch seltsame Ergebnisse sah. Diesen Teil der Frage jetzt ändern. –
Die Notation '\ u1D800' und die meisten anderen Notationen sind überhaupt nicht gültig (oder, technisch gesehen, '\ u1D800', bedeutet U + 1D80 gefolgt von der Ziffer Null. Bitte formulieren Sie Ihre Frage in Unicode-Zeichen, nicht mit ( –