Quitar acentos y caracteres especiales
¿Alguna vez has visto una nota de este tipo?
Los acentos y caracteres especiales fueron omitidos para su correcta lectura en cualquier medio electronico.
Los acentos han sido removidos intencionalmente, para que este mensaje pueda ser leido por todos los programas de correo.
El siguiente fragmento de código sustituye las vocales con acento por vocales sin acento y la ñ
por n
(mayúsculas o minúsculas):
= "ÁáÉéÍíÓóÚúÑñÜü";
private static final String REPLACEMENT
= "AaEeIiOoUuNnUu";
public static String stripAccents(String str) {
if (str == null) {
return null;
}
char[] array = str.toCharArray();
for (int index = 0; index < array.length; index++) {
int pos = ORIGINAL.indexOf(array[index]);
if (pos > -1) {
array[index] = REPLACEMENT.charAt(pos);
}
}
return new String(array);
}
Por ejemplo:
JOptionPane.showMessageDialog(null,
stripAccents("La cigüeña tocaba el saxofón detrás del palenque de paja.")
);
}
Este método puede ser muy conveniente cuando se quiere enviar un SMS a través de un SMS gateway, pero utilizando GSM 03.38, el cual permite hasta 160 caracteres por mensaje. Con Unicode (UTF-16), la longitud disminuye a 70 caracteres, pero es posible que el mensaje no se muestre correctamente en algunos teléfonos «antiguos». En ese caso, quizás haya que considerar también ¡
o ¿
.
~~~
- jpaul's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
Que diferencia hay con i18n ?
No he hecho aplicaciones para SMS, ni para moviles y por eso hago la pregunta, en ellas se puede manejar la internacionalización o es otra cosa de la que hablamos, tal vez no entendi muy bien el contexto.
Re: I18N
Sí, es otra cosa. Aquí sólo se trata de reemplazar algunos caracteres por otros. I18N tiene que ver con mostrar una interfaz en diferentes idiomas (incluye formatos de fecha y números), dependiendo de la configuración del usuario.
~~~
Versión en Groovy
def s1 = 'AaEeIiOoUuNnUu'
def s2 = 'ÁáÉéÍíÓóÚúÑñÜü'
s2.inject(0) { i, v ->
str = str?.replaceAll(v, s1[i])
i += 1
}
return str
}
//...
def input = 'La cigüeña tocaba el saxofón detrás del palenque de paja.'
def output = 'La ciguena tocaba el saxofon detras del palenque de paja.'
assert stripAccents(input) == output
Saludos.
Otra versión con groovy
def s = [
['Á','A'], ['É','E'], ['Í','I'],
['Ó','O'], ['[ÚÜ]','U'], ['Ñ', 'N'],
['á','a'], ['é','e'], ['í','i'],
['ó','o'], ['[úü]','u'], ['ñ', 'n'],
]
if(str)
s.each { sa ->
str = str.replaceAll(sa[0], sa[1])
}
return str
}
//...
def input = 'La cigüeña tocaba el saxofón detrás del palenque de paja.'
def output = 'La ciguena tocaba el saxofon detras del palenque de paja.'
assert stripAccents(input) == output
Versión en JavaScript
He aquí una versión en JavaScript:
if (typeof input != "string") {
return input;
}
var ORIGINAL = "ÁáÉéÍíÓóÚúÑñÜü";
var REPLACEMENT = "AaEeIiOoUuNnUu";
var output = "";
for (i = 0; i < input.length; i++) {
var c = input[i];
var pos = ORIGINAL.indexOf(c);
output += pos > -1 ? REPLACEMENT[pos] : c;
}
return output;
}
Ver demo en línea.
~~~
falta
Faltan todos los acentos graves y circunflejos, diéresis en otras letras, angstroms... qué hacen con esto? åçäâ㜿¡“”«»à
Ahí les va uno que seguro no se sabían y está disponible desde Java 6:
String proc = java.text.Normalizer.normalize(ejemplo,java.text.Normalizer.Form.NFD);
StringBuilder sb = new StringBuilder();
for (char c : proc.toCharArray()) {
if (Character.UnicodeBlock.of(c) == Character.UnicodeBlock.BASIC_LATIN) {
sb.append(c);
}
}
El problema de este método es que se come algunos caracteres especiales pero al menos todas las letras las conserva.
+1 por compartir
Orale, no pues no conocía esa forma, +1 por compartir.
Es bueno saber...
Es bueno saber este tipo de cosas, en ciertos escenario sería muy útil, pongo un ejemplo que encontré en stackoverflow
def input = "Tĥïŝ ĩš â fůňķŷ Šťŕĭńġ åçäâ㜿¡“”«» áåàäâã 12345";
def output = Normalizer
.normalize(input, Normalizer.Form.NFD)
.replaceAll("[^\\p{ASCII}]", "")
assert output == 'This is a funky String acaaa aaaaaa 12345'
¡Excelente!
¡Excelente! No hay que olvidar considerar también las ligaduras, por ejemplo:
fi
o\uFB01
; porque, de lo contrario, serán removidos. Ciertamente no son comunes del idioma español, ni tampoco muchos de esos símbolos cutsie que mencionan.Saludos @jpaul
Que onda jpaul, te mande un correo a un correo con dominio xxxxx@netbeans.org, tendrás un medio para contactarte? Estes esta es mi cuenta en Twitter, Saludos.