我的网站允许其用户在远程服务器上上传文件。为了避免服务器上的文件名出现问题,我想应用一个简单的规则来命名服务器上的文件:
我的代码看起来像
protected String serverFilename(String localFilename) {
if (localFilename == null || localFilename.length() == 0) {
throw new IllegalArgumentException("Invalid filename for upload (localFilename=" + localFilename + ")");
}
String result = Normalizer.normalize(localFilename, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "").replaceAll("[^a-zA-Z0-9.]", "_").toLowerCase();
LOG.debug("filename " + localFilename + " returns: " + result);
return result;
}
这个单元测试运行得很好:
assertEquals("capture_d_ecran_2012_08_02_a_12.45.29.png", uploader.serverFilename("Capture d’écran 2012-08-02 à 12.45.29.png"));
但是在实际操作中,即在Mac服务器上本地运行的Tomcat 6中,当文件名相似的文件时,我得到一个名为'capture_d_ao__cran_2012_07_10 ____ 10.22.01.png'的文件名:
filename Capture d’écran 2012-07-10 à 10.22.01.png returns: capture_d_ao__cran_2012_07_10____10.22.01.png
我想某处有某种错误编码,但我不知道在哪里。 关于如何解决这个问题的任何提示?
UPDATE :Java源文件和负责上传文件的HTML都是UTF-8编码。
答案 0 :(得分:0)
我猜测Java源文件使用不同的编码保存(Mac上的默认设置往往是MacRoman,但是you should always use UTF-8 everywhere)而不是HTTP请求编码。
根据OP的要求进行了Copypasta。