1
我的网站允许其用户在远程服务器上上传文件。为了避免在服务器上的文件名的麻烦,我想申请一个简单的规则来命名服务器上上传的文件:使用Java对字符串进行规范化时编码伪影
- 替换所有重音字母(A,E,E等),通过他们的重音当量(即A,E,在我们的例子E)
- 由下划线
- 替换所有特殊字符小写整个事情
我的代码看起来像
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"));
但在实际的行动,即在Tomcat中6一台Mac服务器,当有类似的文件名的文件,我得到了一个名为文件名“capture_d_ao__cran_2012_07_10上本地运行____ 01年10月22日.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编码的。
http://stackoverflow.com/questions/3665682/utf-8-encoding-and-http-parameters:创建一个过滤器并将其放入我的web.xml中,以UTF-8编码所有hTTP通信诀窍。谢谢! – 2012-08-02 13:48:35