在Android上,文件名允许使用哪些特殊字符?
~!@#$%^&*()_+/\.,
此外,我可以保存具有Unicode名称的文件吗?
在Android上,文件名允许使用哪些特殊字符?
~!@#$%^&*()_+/\.,
此外,我可以保存具有Unicode名称的文件吗?
在Android上(至少默认情况下),文件名以UTF-8编码。
看起来保留的文件名字符取决于挂载的文件系统(http://en.wikipedia.org/wiki/Filename)。
我认为以下字符是保留的:
private static final String ReservedChars = "|\\?*<\":>+[]/'";
'+[]'
,这实际上是Windows字符集。但它仅描述无效的可打印字符。在Windows上,控制字符0x00-0x1f
和0x7f
也是无效的。为了实现互操作性,这可能很有用。但是在Unix(因此也是Android)上,唯一无效的字符是NULL
(0x00
)和/
。 - caw private static boolean isValidFatFilenameChar(char c) {
if ((0x00 <= c && c <= 0x1f)) {
return false;
}
switch (c) {
case '"':
case '*':
case '/':
case ':':
case '<':
case '>':
case '?':
case '\\':
case '|':
case 0x7F:
return false;
default:
return true;
}
}
private static boolean isValidExtFilenameChar(char c) {
switch (c) {
case '\0':
case '/':
return false;
default:
return true;
}
}
注意: FileUtils是隐藏的API(不适用于应用程序; 仅供AOSP使用)。使用时可以作为参考(或通过反射自行承担风险)。
final String[] ReservedChars = {"|", "\\", "?", "*", "<", "\"", ":", ">"};
for(String c :ReservedChars){
System.out.println(dd.indexOf(c));
dd.indexOf(c);
}
这是Android中用于文件名的正确InputFilter:
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;
}
};
这显然取决于文件系统和Android操作系统。在我的OnePlus/OxygenOS上,接受的答案中只有这些字符
private static final String ReservedChars = "|\\?*<\":>+[]/'";
我无法使用 / 和 * 用于文件重命名。
然而,在 Android 广泛使用的情况下,上述列表似乎是合理的。
? : " * | / \ < >
我将所有其他特殊字符放入文件名中并保存了下来。这可能在所有安卓版本中不一致,因此最好保守一些,用类似含义的字符替换它们。在Android上,建议使用输入过滤器来防止用户输入无效字符,以下是更好的实现方式:
/**
* An input filter which can be attached to an EditText widget to filter out invalid filename characters
*/
class FileNameInputFilter: InputFilter
{
override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence? {
if (source.isNullOrBlank()) {
return null
}
val reservedChars = "?:\"*|/\\<>\u0000"
// Extract actual source
val actualSource = source.subSequence(start, end)
// Filter out unsupported characters
val filtered = actualSource.filter { c -> reservedChars.indexOf(c) == -1 }
// Check if something was filtered out
return if (actualSource.length != filtered.length) {
// Something was caught by our filter, provide visual feedback
if (actualSource.length - filtered.length == 1) {
// A single character was removed
BrowserApp.instance.applicationContext.toast(R.string.invalid_character_removed)
} else {
// Multiple characters were removed
BrowserApp.instance.applicationContext.toast(R.string.invalid_characters_removed)
}
// Provide filtered results then
filtered
} else {
// Nothing was caught in our filter
null
}
}
}
NULL
(0x00
)和/
。为了实现互操作性,您可能会对下面答案中的Windows列表感兴趣。 - caw