java - 在 Java 中规范化字符串时编码人工制品

标签 java tomcat encoding normalize

我的网站允许其用户上传远程服务器上的文件。为了避免服务器上的文件名出现问题,我想应用一个简单的规则来命名服务器上上传的文件:

  1. 将所有带重音的字母(à、é、è 等)替换为对应的无重音字母(即我们示例中的 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"));

但在实际操作中,即在 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

我猜某处存在某种编码错误,但我不知道在哪里。 关于如何解决此问题的任何提示?

更新:Java 源文件和负责上传文件的 HTML 都是 UTF-8 编码的。

最佳答案

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

应 OP 的要求复制粘贴。

关于java - 在 Java 中规范化字符串时编码人工制品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11778163/

相关文章:

ruby - 如何避免双重编码 URI

java - ZeroMQ+Protobuf 的替代品(ZeroMQ 对 Java 来说已经死了吗?)

java - 如何将 JAXB 运行时库与 OpenJDK 11 捆绑在一起?

java - 有没有办法在运行时加载类 jar 和包?

java - Java 类可以模拟另一个 Windows 用户吗?

c# - Unicode 字符串到二进制字符串和二进制字符串到 unicode c#

java - 我们如何将 play.libs.concurrent.HttpExecutionContext 传递给 Java 8 中的并行流?

java - 如何在 Tomcat JMX Beans 中隐藏数据源密码

java - Broadleaf Commerce Tomcat 安装

Ruby:将编码字符转换为实际的 UTF-8 字符