style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

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 ORIGINAL
        = "ÁáÉéÍíÓóÚúÑñÜü";
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:

public static void main(String[] args) {
    JOptionPane.showMessageDialog(null,
            stripAccents("La cigüeña tocaba el saxofón detrás del palenque de paja.")
    );
}

Message

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 ¿.

~~~

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Cid

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.

~~~

Imagen de rodrigo salado anaya

Versión en Groovy

def stripAccents = { str ->
    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.

Imagen de rodrigo salado anaya

Otra versión con groovy

def stripAccents = { str ->
    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:

function stripAccents(input) {
    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.

~~~

Imagen de ezamudio

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 ejemplo = "áåàäâã 12345"
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.

Imagen de rodrigo salado anaya

+1 por compartir

Orale, no pues no conocía esa forma, +1 por compartir.

Imagen de rodrigo salado anaya

Es bueno saber...

Es bueno saber este tipo de cosas, en ciertos escenario sería muy útil, pongo un ejemplo que encontré en stackoverflow

import java.text.Normalizer

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: 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.

Imagen de rodrigo salado anaya

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.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">