2013-06-02 5 views
5

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:

  1. \u1dfff zeigt nicht als ein Zeichen up - \u1dff bekommt konvertiert in ein Zeichen und f am Ende behandelt es als sein eigenes Zeichen
  2. 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.

+0

'\ xdfff' als' \ xdf' interpretiert wird, 'f' und' f'. – Blender

+0

Ahh, du hast recht, das erklärt, warum ich in meinem zweiten Versuch seltsame Ergebnisse sah. Diesen Teil der Frage jetzt ändern. –

+0

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 ( –

Antwort

4

Es scheint, dass Sie versuchen, Unicode-Ersatzcode-Einheiten aus der Zeichenfolge zu entfernen. Jedoch sind nur U + D800 bis U + DFFF Ersatzcodepunkte; Die übrigen Werte, die Sie benennen, sind nicht gültig und könnten gültigen Unicode-Zeichen zugewiesen werden.In diesem Fall genügt die folgende (verwenden \u statt \x zu Unicode-Zeichen zu beziehen):

buffer.replace(/[\ud800-\udfff]/g, ""); 
+0

Danke für die Antwort Peter Ich habe t bearbeitet er stellt weitere Details darüber, wie ich auf die Liste der Charaktere kam, die entfernt werden müssen. Nachdem ich das \ x durch \ u ersetzt habe, hörte ich auf, einen Syntaxfehler zu bekommen, aber ich bemerkte irgendein anderes interessantes Verhalten, das ich in der Änderung umrissen habe. Danke nochmal fürs schauen. –

+0

Ich habe mich weiter damit beschäftigt, und wie sich herausstellt, hast du recht damit, dass ich mich nur um den ersten Bereich kümmern muss. Ich habe eine Erklärung in einer zweiten Bearbeitung hinzugefügt, die ich zu der Frage gemacht habe. –

Verwandte Themen