La primera solución no funciona para ningún alfabeto UTF-8. (Cortará texto como Їжак). He logrado crear una función que no utiliza RegExp y utiliza un buen soporte UTF-8 en el motor de JavaScript. La idea es simple si un símbolo es igual en mayúsculas y minúsculas, es un carácter especial. La única excepción se hace para espacios en blanco.
function removeSpecials(str) {
var lower = str.toLowerCase();
var upper = str.toUpperCase();
var res = "";
for(var i=0; i<lower.length; ++i) {
if(lower[i] != upper[i] || lower[i].trim() === '')
res += str[i];
}
return res;
}
Actualización: Tenga en cuenta que esta solución funciona solo para idiomas donde hay letras minúsculas y mayúsculas. En idiomas como el chino, esto no funcionará.
Actualización 2: llegué a la solución original cuando estaba trabajando en una búsqueda difusa. Si también intenta eliminar caracteres especiales para implementar la funcionalidad de búsqueda, existe un mejor enfoque. Utilice cualquier biblioteca de transliteración que produzca su cadena solo de caracteres latinos y luego el Regexp simple hará toda la magia de eliminar caracteres especiales. (Esto también funcionará para los chinos y también recibirá beneficios secundarios al hacer Tromsø
== Tromso
).