2013-06-02 14 views
5

Sto provando a rimuovere ogni carattere Unicode in una stringa se rientra in uno qualsiasi degli intervalli sottostanti.Rimuovere i caratteri Unicode all'interno di vari intervalli 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 

Come un primo prototipo, ho cercato di rimuovere solo caratteri all'interno del primo intervallo utilizzando una regex nella funzione replace.

var buffer = "he\udfffllo world"; 
var output = buffer.replace(/[\ud800-\udfff]/g, ""); 
d.innerText = buffer + " is replaced with " + output; 

In questo caso, il personaggio sembra essere stato sostituito bene.

Tuttavia, quando sostituisco che con

var buffer = "he\udfffllo worl\u1dfffd"; 
var output = buffer.replace(/[\ud800-\udfff\u1d800-\u1dfff]/g, ""); 
d.innerText = buffer + " is replaced with " + output; 

vedo qualcosa di inaspettato. La mia uscita si presenta come:

ciao worl᷿fd viene sostituito con

Ci sono due cose da notare qui:

  1. \u1dfff non si presenta come un carattere - \u1dff ottiene convertito in un carattere e il f alla fine ha trattato come proprio carattere
  2. il risultato è una stringa vuota.

Qualsiasi suggerimento su come posso ottenere questo risultato sarebbe molto apprezzato.


EDIT

Il mio obiettivo generale è quello di filtrare tutti i caratteri che la funzione encodeURIComponent considera non valida. Ho eseguito alcuni test e ho trovato la lista sopra come set di caratteri non valido. Ad esempio, il codice seguente, che converte prima 1dfff in un carattere unicode prima di passarlo a encodeURIComponent, fa sorgere un'eccezione da quest'ultima funzione.

var v = String.fromCharCode(122879); 
var uriComponent = encodeURIComponent(v); 

ho modificato parti della questione dopo @Blender ha sottolineato che stavo usando x invece di u nel mio codice per rappresentare i caratteri Unicode.


EDIT 2

ho studiato la mia tecnica per andare a prendere l'unicode "non valido" va oltre, e come si scopre, se si dà String.fromCharacterCode un numero che è più grande di 16 bit, sarà basta guardare i 16 bit più bassi del numero. Questo spiega lo schema che stavo vedendo. Quindi, a quanto pare, devo solo preoccuparmi del primo intervallo.

+0

'\ xdfff' viene interpretata come' \ xdf', '' f' e f'. – Blender

+0

Ah, hai ragione, questo spiega perché stavo vedendo risultati strani nel mio secondo tentativo. Cambiando quella parte della domanda ora. –

+0

La notazione '\ u1D800' e la maggior parte delle altre notazioni non sono affatto valide (o, tecnicamente,' \ u1D800', significa U + 1D80 seguite dalla cifra zero. Formulate la vostra domanda in termini di caratteri Unicode, non usando presunte (e non valide) notazioni di escape per loro. –

risposta

4

Sembra che si stia tentando di rimuovere le unità di codice surrogato Unicode dalla stringa. Tuttavia, solo U + D800 tramite U + DFFF sono punti di codice surrogato; i restanti valori nominati non sono e potrebbero essere assegnati a caratteri Unicode validi.In tal caso, il seguente sarà sufficiente (usate \u anziché \x riferirsi ai caratteri Unicode):

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

Grazie per la risposta Peter . Ho modificato t chiede di includere maggiori dettagli su come sono arrivato alla lista dei personaggi che devono essere rimossi. Dopo aver sostituito \ x con \ u, ho smesso di ottenere un errore di sintassi, ma ho notato qualche altro comportamento interessante che ho delineato nella modifica. Grazie ancora per la ricerca. –

+0

Scavalcati ulteriormente e, a quanto pare, hai ragione sul fatto che devo solo preoccuparmi del primo intervallo. Ho aggiunto una spiegazione in una seconda modifica che ho apportato alla domanda. –

Problemi correlati