如何替换文件名中的非法字符?

时间:2014-09-30 10:10:53

标签: java regex filenames sanitization replaceall

我正在尝试创建一个带有文件夹的zip文件,我必须针对任何非法字符清理文件夹名称。我做了一些谷歌搜索,并从http://www.rgagnon.com/javadetails/java-0662.html找到了这个方法:

public static String sanitizeFilename(String name) {
    return name.replaceAll("[\\\\/:*?\"<>|]", "-");
}

然而,经过测试,我得到了一些奇怪的结果。例如:

name = filename£/?e>"e

应该从我的理解中返回filename£--e--e。但它返回filename-ú--e--e

为什么会这样?

请注意我通过在WinZip中打开下载的zip文件并查看创建的文件夹名称来测试。我不能让英镑符号出现。我也试过这个:

public static String sanitizeFilename(String name) {
    name = name.replaceAll("[£]", "\u00A3");
    return name.replaceAll("[\\\\/:*?\"<>|]", "-");
}
编辑:我还发现了一些更多的研究:http://illegalargumentexception.blogspot.co.uk/2009/04/i18n-unicode-at-windows-command-prompt.html 它似乎与Locale,Windows版本和编码因素有关。不知道如何在代码中克服这个问题。

1 个答案:

答案 0 :(得分:3)

我认为这取决于您在编码方面实际读取文件名的方式。

因此,£符号可能会损坏。

作为一个不完全符合您案例的示例,将UTF-8编码的£作为ISO Latin 1编码字符读取将返回£

确保文件的编码(即ISO Latin 1与UTF-8最常见),然后为Reader使用适当的参数。

作为一个片段,您可能需要考虑以下示例:

BufferedReader br = new BufferedReader(
    new InputStreamReader(
        new FileInputStream(new File("yourTextFile")), 
        "[your file's encoding]"
    )
);