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.