Ho l'impressione che l'interprete JavaScript presupponga che il codice sorgente che sta interpretando sia già stato normalizzato. Cosa fa esattamente la normalizzazione? Non può essere l'editor di testo, altrimenti la rappresentazione in chiaro della sorgente cambierebbe. C'è un "preprocessore" che fa la normalizzazione?Normalizzazione JavaScript Unicode
risposta
No, non esiste alcuna funzione di normalizzazione Unicode utilizzata automaticamente o anche disponibile per JavaScript come da ECMAScript 5. Tutti i caratteri rimangono invariati come i loro punti di codice originali, potenzialmente in forma non normale.
ad esempio prova:
<script type="text/javascript">
var a= 'café'; // caf\u00E9
var b= 'café'; // cafe\u0301
alert(a+' '+a.length); // café 4
alert(b+' '+b.length); // café 5
alert(a==b); // false
</script>
Aggiornamento:ECMAScript 6 will introduce Unicode normalization for JavaScript strings.
Va sottolineato che JavaScript * PREDE * UTF-16 e espone effettivamente UCS-2. (Quello che usa internamente può essere o non essere UTF-16, ma caccia fuori UCS-2.) –
Se stai usando node.js
, c'è una biblioteca unorm
per questo.
Questo funziona anche in chrome – jontro
ECMAScript 6 introduce String.prototype.normalize()
che si occupa di normalizzazione Unicode per voi.
unorm è un polyfill JavaScript per questo metodo, quindi è possibile utilizzare già String.prototype.normalize()
anche se al momento non è supportato un singolo motore in modo nativo.
Per ulteriori informazioni su come e quando utilizzare la normalizzazione Unicode in JavaScript, vedere JavaScript has a Unicode problem – Accounting for lookalikes.
Ho aggiornato la risposta s' @bobince:
var cafe4= 'caf\u00E9';
var cafe5= 'cafe\u0301';
console.log (
cafe4+' '+cafe4.length, // café 4
cafe5+' '+cafe5.length, // café 5
cafe4 === cafe5, // false
cafe4.normalize() === cafe5.normalize() // true
);
Il motore del browser credo è quello che gestisce. Ecco perché hai le discrepanze tra i browser su ciò che fanno e non supportano. – Ryan