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
}
|