Tenemos un problema con la lectura de caracteres especiales de nuestra base de datos. Tenemos la codificación de caracteres configurada como UTF-8 en todas partes y la base de datos aparentemente almacena todos los caracteres correctamente. Por ejemplo, tenemos una palabra con é y se ve bien en la pantalla. También en los objetos de respuesta JSON, el carácter se ve bien (con el acento) e incluso aparentemente funciona cuando copiamos al portapapeles y pegamos. Pero cuando hacemos una comparación estricta é === é obtenemos false como resultado. Resulta que la é almacenada devuelve el código de caracteres 101, que es una e sin el acento (no el código de caracteres esperado 233 ).
é = código 233é = código 101 Demostraré el problema incluso aquí en este fragmento de código: ambos caracteres tienen el mismo aspecto pero uno de ellos genera 233 y el otro 101 .
// é = 233 // é = 101 console.log("é".charCodeAt()); console.log("é".charCodeAt()); ¿Por qué está pasando esto? Aparentemente, el hecho de que el carácter sea una e con acento se almacena de alguna manera correctamente en la base de datos (parece correcto), pero no se muestra como se esperaba al cliente. ¿Cómo podemos hacer cumplir que el carácter se lea correctamente como una e con un acento como é (código 233)?
Mi respuesta estaba aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
La segunda é es en realidad 2 caracteres: la e y un carácter combinado para el acento. La solución es llamar a .normalize() y luego puedo comparar estrictamente.
// é = 233 (one single char) // é = 101 (actually 2 characters, first is "e") console.log("é".length); console.log("é".length); // Normalizing will return char 233 and then strict comparison will work. console.log("é".normalize() === "é");