accents javascript string firefox unicode unicode-normalization

accents - Cuando una cadena no es una cadena? Normalización Unicode rareza en Javascript



javascript normalize string accents (1)

Me he encontrado con lo que es, para mí, una rareza grave con el comportamiento de las cuerdas en Firefox cuando .normalize() función de normalización Unicode .normalize() .

Here hay una demostración, vea la consola en Firefox para ver el problema.

Supongamos que tengo un botón con un ID de "NFKC":

<button id="NFKC">NFKC</button>

Obtener una referencia a eso, lo suficientemente fácil:

document.querySelector(''#NFKC'') // <button id="NFKC">

Ahora, ya que este botón tiene un ID de NFKC, que podemos obtener en esa cadena de la siguiente manera:

document.body.querySelector(''#NFKC'').id // "NFKC"

Pegue esa cadena en una variable:

var s1 = document.body.querySelector(''#NFKC'').id

A modo de comparación, asigne la misma cadena a una variable directamente:

var s2 = ''NFKC''

Asi que por su puesto:

s1 === s2 // true

Y:

s1 == s2 // true

Ahora es la parte donde explota mi cabeza.

Para normalizar una cadena, pasas una de NFC , NFD , NFKC o NFKD a .normalize() , como esto:

''á''.normalize(''NFKC'') // "á"

Por supuesto, dependiendo de la forma de normalización que elija, obtendrá diferentes puntos de código, pero lo que sea.

''á''.normalize(''NFC'').length == 1 // true ''á''.normalize(''NFD'').length == 2 // true

Pero lo que sea. El punto es, pase una de las cuatro cadenas correspondientes a las formas de normalización a .normalize() , y obtendrá una cadena normalizada de nuevo.

Como sabemos que s1 (la cadena que recuperamos del DOM) y s2 son LA MISMA CADENA ( s1 === s2 es true ), entonces obviamente podemos usar cualquiera de los dos para normalizar una cadena:

''á''.normalize(s2) "á" // well yeah, because s2 IS ''NFKC''.

Naturalmente, s1 se comportará exactamente de la misma manera, ¿verdad?

''á''.normalize(s1) // RangeError: form must be one of ''NFC'', ''NFD'', ''NFKC'', or ''NFKD''

No

Entonces, la pregunta es: ¿por qué parece que s1 no es igual a s2 en lo que respecta a .normalize() , cuando s1 === s2 es verdadero?

Esto no sucede en Chrome, el único otro navegador que he probado hasta ahora.

ACTUALIZAR

Esto fue un error en Firefox y se ha corregido .


No estoy seguro de si esto ayudará, pero la documentación indica que

Esta es una tecnología experimental, parte de la propuesta de Harmony (ECMAScript 6). Debido a que la especificación de esta tecnología no se ha estabilizado, verifique la tabla de compatibilidad para su uso en varios navegadores. También tenga en cuenta que la sintaxis y el comportamiento de una tecnología experimental están sujetos a cambios en la versión futura de los navegadores a medida que cambien las especificaciones.

Y la tabla de compatibilidad es

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari Basic support 34 31 (31) 11 on Windows 10 Preview (Yes) Not supported

Sin embargo, la última actualización de esta página fue el 18 de noviembre de 2014.