Intenté usar el método normalize('NFKC') con diferentes caracteres, pero no funcionó. Afortunadamente, no puedo decir esto de NFC . Cuando es posible, normalize('NFC') siempre reemplaza múltiples puntos de código con uno solo. Por ejemplo:
let t1 = `\u00F4`; //ô let t2 = `\u006F\u0302`; //ô console.log(t2.normalize('NFC') == t1); //true Y aquí hay un ejemplo con NFKC que nunca funciona:
let s1 = '\uFB00'; //"ff" let s2 = '\u0066\u0066'; //"ff" console.log(s2.normalize('NFKC') == s1); //false Pensé antes que NFKC reemplaza múltiples puntos de código con el único que representa un carácter compatible. En pocas palabras, pensé que NFKC reemplazaría \u0066\u0066 con \uFB00 .
Si NFKC no funciona así, entonces... ¿cómo funciona?
La cuestión es que NFKC (así como NFKD ) admite normalización compatible y canónicamente equivalente.
El tipo de descomposición completa elegido depende de la forma de normalización Unicode involucrada. Para NFC o NFD, uno hace una descomposición canónica completa, que utiliza solo valores canónicos de Decomposition_Mapping. Para NFKC o NFKD, se realiza una descomposición de compatibilidad completa, que utiliza valores de Decomposition_Mapping canónicos y de compatibilidad.
Y eso es completamente comprensible porque como dice MDN :
Todas las secuencias canónicamente equivalentes también son compatibles, pero no al revés.
Pero también vale la pena notar que NFKC hace normalizaciones compatibles y canónicamente equivalentes de diferentes maneras. La normalización canónicamente equivalente por NFKC se produce de la misma manera que NFC . Por ejemplo:
//"ô" (U+00F4) -> "a" (U+006F) + " ̂" (U+0302) -> "â" (U+00F4) let c1 = `\u006F\u0302`; //ô console.log(c1.normalize('NFKC').length); //1Pero la normalización compatible por este parámetro funciona de manera diferente. La especificación dice:
El formulario de normalización KC no intenta asignar secuencias de caracteres a compuestos de compatibilidad. Por ejemplo, una composición de compatibilidad de “oficina” no produce “o\uFB03ce”, aunque “\uFB03” es un carácter que es el equivalente de compatibilidad de la secuencia de tres caracteres “ffi”. En otras palabras, la fase de composición de NFC y NFKC es la misma; solo difiere su fase de descomposición, y NFKC aplica descomposiciones de compatibilidad.
Por ejemplo:
//"ff"(U+FB00) -> "f"(U+0066) + "i"(U+0066) -> "f"(U+0066) + "i"(U+0066) let c2 = '\u0066\u0066'; //ff console.log(c2.normalize('NFKC').length); //2