studio - ¿Qué caracteres permitían los nombres de archivo en Android?
manual de programacion android pdf (6)
En Android (al menos de forma predeterminada) los nombres de los archivos codificados como UTF-8.
Parece que los caracteres reservados del nombre de archivo dependen del sistema de archivos montado ( http://en.wikipedia.org/wiki/Filename ).
Considerado como reservado:
private static final String ReservedChars = "|//?*</":>+[]/''";
¿Qué caracteres especiales están permitidos para los nombres de archivos en Android?
~!@#$%^&*()_+//.,
Además, ¿puedo guardar el archivo con el nombre Unicode?
De acuerdo con wiki y suponiendo que está utilizando almacenamiento de datos externo que tiene FAT32.
Caracteres permitidos en las entradas de directorio
son
Cualquier byte excepto los valores 0-31, 127 (DEL) y: "* /: <>? / | +,.; = [] (Lowcase az se almacenan como AZ). Con VFAT LFN cualquier Unicode excepto NUL
Este es el InputFilter correcto para los nombres de archivo en Android:
InputFilter filter = new InputFilter()
{
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
{
if (source.length() < 1) return null;
char last = source.charAt(source.length() - 1);
String reservedChars = "?:/"*|///<>";
if(reservedChars.indexOf(last) > -1) return source.subSequence(0, source.length() - 1);
return null;
}
};
Esto es claramente el sistema de archivos y el sistema operativo Android dependiente. En mi oneplus / oxygenOS, los únicos caracteres en la respuesta aceptada
private static final String ReservedChars = "|//?*</":>+[]/''";
que no pude usar para cambiar el nombre de un archivo fueron / y *
Sin embargo, Android de ancho, la lista anterior parece ser sensata.
Probé esto rápidamente en mi Galaxy Note 8 en Android 4.4.2. La aplicación My Files predeterminada atenúa los caracteres no válidos que son los siguientes:
? : "* | / / <>
Puse todos los otros caracteres especiales disponibles en un nombre de archivo y se guardó. Es posible que esto no sea coherente en todas las versiones de Android, así que tal vez lo mejor sea ser conservador y reemplazarlo por caracteres con significado similar.
final String[] ReservedChars = {"|", "//", "?", "*", "<", "/"", ":", ">"};
for(String c :ReservedChars){
System.out.println(dd.indexOf(c));
dd.indexOf(c);
}