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:
\u1dfff
non si presenta come un carattere -\u1dff
ottiene convertito in un carattere e ilf
alla fine ha trattato come proprio carattere- 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.
'\ xdfff' viene interpretata come' \ xdf', '' f' e f'. – Blender
Ah, hai ragione, questo spiega perché stavo vedendo risultati strani nel mio secondo tentativo. Cambiando quella parte della domanda ora. –
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. –