2012-08-02 64 views
1

我的网站允许其用户在远程服务器上上传文件。为了避免在服务器上的文件名的麻烦,我想申请一个简单的规则来命名服务器上上传的文件:使用Java对字符串进行规范化时编码伪影

  1. 替换所有重音字母(A,E,E等),通过他们的重音当量(即A,E,在我们的例子E)
  2. 由下划线
  3. 替换所有特殊字符小写整个事情

我的代码看起来像

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编码的。

回答

0

我猜测,Java源文件使用不同的编码(Mac上的默认值往往是MacRoman,但是you should always use UTF-8 everywhere)保存为HTTP请求编码。

复制帕斯塔德在OP的请求。

+1

http://stackoverflow.com/questions/3665682/utf-8-encoding-and-http-parameters:创建一个过滤器并将其放入我的web.xml中,以UTF-8编码所有hTTP通信诀窍。谢谢! – 2012-08-02 13:48:35