[Métodos] Reemplazar caracteres con acento, tildes, signos diacriticos, etc

Mi problema, windows no acepta caracteres diacriticos para nombres de archivos o directorios, como los acentos graves y agudos ( ´ ) y ( ` ), el acento circunflejo ( ^ ), la diéresis ( ¨ ), la virgulilla ( ~ ), la cedilla ( ¸ ), la colita ( ˛ ), la coma ( , ), el doble acento agudo, ( ˝ ), el doble acento grave, ( `` ) , el carón ( ˇ ), el breve ( ˘ ), el macrón ( ˉ ), el anillo ( ˚ ), el punto ( • ) el garfio ( ̉ )
ja lo saque de wikipedia!

Entonces pense en removeer los caracteres que ningún sistema operativo permite.
1
String invalidCharRemoved = fileName.replaceAll("[\\\\/:*?\"<>|]", "");

Este patrón remueve aquellos caracteres que windows nos informa con una vigneta:

Pero aun asi, los acentos, la Ñ que si son admitos en la mayorias de distribuciones de windows siguen estando, pero justo el servidor productivo no era uno de ellos.
La siguiente solucion, aunque torpe, satisfacia la problematica y permitía a la aplicación seguir funcionando:
1
string.replace("á", "").replace("é", "").replace("í", "").replace("ó", "").replace("ú", "").replace("ñ", "")

Aunque funcional, a gusto personal no es aceptable:
1
evaluación desempeño región aledaños --> evaluacin desempeo regin aledaos

Para lo cual encontré 2 posibles soluciones: Java.text.Normalizer y org.apache.commons.lang3.StringUtils

Normalizer

1
2
3
4
5
6
import java.text.Normalizer;
...
private static String normalizeUsingJavaText(String source){
    source = Normalizer.normalize(source, Normalizer.Form.NFD);
    return source.replaceAll("[^\\p{ASCII}]", "");
}

Esto podria ser usado asi:
1
2
3
4
5
public static void main(String[] args){
    String string = "áéíóúñ";
    System.out.println(normalizeUsingJavaText(cadenaLoca()));
    //salida --> aeioun
}


StringUtils


Esta es un dependencia, y por lo cual hay que importarla por ejemplo con maven:
1
2
3
4
5
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.0</version>
</dependency>

Simplemente basta con llamar al metodo stripAccents:
1
2
3
4
5
6
import org.apache.commons.lang3.StringUtils;
...
private static String normalizeUsingApacheStringUtils(String source){
    String input = StringUtils.stripAccents(source);
    return input;
}

Esto lo implemente asi: (Esta fué la solución ganadora)
1
2
3
4
5
public static void main(String[] args){
    String string = "áéíóúñ";       
    System.out.println(normalizeUsingApacheStringUtils(string));
    // salida -> aeioun
}

No hay comentarios:

Publicar un comentario