51

Android 上的文件名允许使用哪些特殊字符?

~!@#$%^&*()_+/\.,

另外,我可以用 Unicode 名称保存文件吗?

4

8 回答 8

39
  1. 在 Android 上(至少在默认情况下)编码为 UTF-8 的文件名。

  2. 看起来保留的文件名字符取决于安装的文件系统(http://en.wikipedia.org/wiki/Filename)。

我认为保留:

private static final String ReservedChars = "|\\?*<\":>+[]/'";
于 2010-04-24T09:16:27.857 回答
10

根据wiki并假设您正在使用具有 FAT32 的外部数据存储。

目录条目中允许的字符

除值 0-31、127 (DEL) 和:" * / : < > ? \ | + , . ; = [] (小写 az 存储为 AZ)之外的任何字节。对于 VFAT LFN,除 NUL 之外的任何 Unicode

于 2012-11-21T21:02:13.433 回答
8

来自android.os.FileUtils

    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)。用作参考(或通过反思自担风险)

于 2020-09-23T05:12:23.513 回答
7
final String[] ReservedChars = {"|", "\\", "?", "*", "<", "\"", ":", ">"};

for(String c :ReservedChars){
    System.out.println(dd.indexOf(c));
    dd.indexOf(c);
}
于 2011-12-07T13:29:42.300 回答
6

这是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;
        }  
    };
于 2015-02-14T14:17:29.343 回答
2

我在 Android 4.4.2上的Galaxy Note 8上对此进行了快速测试。默认的“我的文件”应用程序有助于将无效字符变灰,如下所示:

? : " * | / \ < >

我将所有其他可用的特殊字符放入文件名并保存。这可能在所有 Android 版本中都不一致,所以最好保守一点,用类似有意义的字符替换它们。

于 2014-11-04T23:36:12.617 回答
2

这显然取决于文件系统和 Android 操作系统。在我的 oneplus/oxygenOS 上,接受答案中的唯一字符

private static final String ReservedChars = "|\\?*<\":>+[]/'";

我不能用来重命名文件的是 / 和 *

但是,在 Android 范围内,上面的列表似乎是明智的。

于 2018-01-10T08:09:57.267 回答
2

在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
        }
    }
}
于 2021-01-10T17:31:45.893 回答