recorrer - ¿Cómo verifico la igualdad de las cadenas Unicode en Javascript?
string to char code javascript (1)
Tengo dos cadenas en Javascript: "_strange_chars_µö¬é@zendesk.com.eml"
( f1
) y "_strange_chars_µö¬é@zendesk.com.eml"
( f2
). A primera vista, se ven idénticos (y, de hecho, en StackOverflow, pueden serlo; no estoy seguro de lo que sucede cuando se pegan en un formulario como este). En mi solicitud, sin embargo,
f1[16] // ö
f2[16] // o
f1[17] // ¬
f2[17] // ̈
Es decir, donde f1
usa el carácter ö , f2
usa una o y un diacrítico ¨ como un carácter separado. ¿Qué comparación puedo hacer para que estas dos cadenas sean "iguales"?
f1
usa el carácter ö,f2
usa una o y un diacrítico ¨ como un carácter separado.
f1
está en la forma normal C (compuesta) y f2
en la forma normal D (descompuesta). En general, la forma normal C es la más común en Windows y en la web, con las preguntas frecuentes de Unicode que la describen como "la mejor forma para texto general". Desafortunadamente, el mundo de Apple optó por la Forma D normal para ser gratuitamente diferente.
Las cadenas son canónicamente equivalentes por las reglas de equivalencia de Unicode .
¿Qué comparación puedo hacer para que estas dos cadenas sean "iguales"?
En general, convierte ambas cadenas a una forma normal de su elección y luego las compara. Por ejemplo en Python:
>>> import unicodedata
>>> a= u''/u00F6'' # ö composed
>>> b= u''o/u0308'' # o then combining umlaut
>>> unicodedata.normalize(''NFC'', a)==unicodedata.normalize(''NFC'', b)
True
De manera similar, Java tiene la clase Normalizer
, .NET tiene String.Normalize
y es posible que los idiomas tengan enlaces disponibles para la biblioteca de la ICU que también ofrece esta característica.
Desafortunadamente, JavaScript no tiene capacidad nativa de normalización de Unicode. Esto significa que:
haciéndolo usted mismo, cargando en grandes tablas de datos Unicode para cubrirlo todo en JavaScript (consulte, por ejemplo, here para ver un ejemplo de implementación); o
enviándolo de vuelta al servidor (por ejemplo, a través de XMLHttpRequest), donde tienes un lenguaje mejor equipado para hacerlo.