【问题标题】:How do I replace illegal characters in a filename?如何替换文件名中的非法字符?
【发布时间】:2014-09-30 10:10:52
【问题描述】:

我正在尝试创建一个包含文件夹的 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 它似乎与语言环境、Windows 版本和编码因素有关。不知道如何在代码中克服这个问题。

【问题讨论】:

  • System.out.println("filename£/?e&gt;\"e".replaceAll("[\\\\/:*?\"&lt;&gt;|]", "-")); 为我工作。
  • 你的实际输入是什么?
  • 以上代码对我有用。你试过了吗?
  • 作为旁注,如果你有两个文件名,像这样:filename£??e&gt;"efilename£\\e&gt;"e?当您解压缩文件时,它们会相互覆盖

标签: java regex filenames sanitization replaceall


【解决方案1】:

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

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

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

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

作为一个sn-p,你可能想考虑这个例子:

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

【讨论】:

    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多