我正在尝试创建一个带有文件夹的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版本和编码因素有关。不知道如何在代码中克服这个问题。
答案 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]"
)
);