【问题标题】:Java File with filename in UTF-8带有 UTF-8 文件名的 Java 文件
【发布时间】:2017-09-05 22:39:11
【问题描述】:

我正在编写一个在 Tomcat 上运行的 Web 应用程序。

在这个网络应用程序中,我想创建/保存这样的文件:

File destFile = new File(path + "/" + fileName);
destFile.createNewFile();

现在棘手的是文件名是一个 UTF-8 编码的字符串。不幸的是,所有 UTF-8 字符(例如德语变音符号)都被替换为“?”在实际创建的文件名中。

所以文件名“hellö.txt”以“hell?.txt”结尾。

我该如何解决这个问题?

我在 Ubuntu 14.04 服务器上运行,据我所知,一切都设置为支持 UTF-8。

我已经将-Dfile.encoding=UTF8 添加到 JAVA_OPTS 中,但这没有帮助。

干杯。

【问题讨论】:

  • locale -a 在运行 Tomcat 的操作系统中表示什么?
  • 我相信这是一个可以通过使用替代 API 创建文件来解决的缺陷。见stackoverflow.com/questions/14171565/…
  • locale -a 给出:C C.UTF-8 en_AG en_AG.utf8 en_AU.utf8 en_BW.utf8 en_CA.utf8 en_DK.utf8 en_GB.utf8 en_HK.utf8 en_IE.utf8 en_IN en_IN.utf8 en_NG en_NG .utf8 en_NZ.utf8 en_PH.utf8 en_SG.utf8 en_US.utf8 en_ZA.utf8 en_ZM en_ZM.utf8 en_ZW.utf8 POSIX

标签: java file utf-8 character-encoding


【解决方案1】:

解决了!

就我而言,这不是 Java 错误。相反,我服务器上的语言环境设置被破坏了。在修复了这里https://askubuntu.com/questions/162391/how-do-i-fix-my-locale-issue 描述的问题后,它现在甚至可以使用java.io.File

【讨论】:

    【解决方案2】:

    即使有可能(我不确定),在文件名中包含“ö”、“ä”等字符也是一种非常糟糕的做法。相反,您应该将它们替换为它们的同义词“oe”或“ae”。

    我为“德国元音变音”编写了一个基本函数

    string removeBadCharacters(String string) {
        string = string.replace("ö", "oe");
        string = string.replace("ä", "ae");
        string = string.replace("ü", "ue");
        string = string.replace("ß", "ss");
        return string;
    }
    

    然后你只需传递你的文件名并使用格式化的字符串:

    File destFile = new File(path + "/" + removeBadCharacters(fileName));
    

    【讨论】:

    • 对于可能的大量 unicode 字符,这是一个非常有限的解决方案;它不适用于您的日语、韩语或希伯来语用户。自 1990 年代以来,文件名中的 Unicode 已得到有效支持。就其价值而言,这似乎是一个旧的 Java 错误。我将发布对上述解决方案的参考。
    • @JasonTrue 是的,你可能是对的。完全忘记了 unicode 不仅仅是 'ä's 和 'ß's。如果您说支持 unicode 文件名,则有更好的解决方案。
    • 谢谢,但正如 JasonTrue 所述,这不是一个非常合适的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 2016-07-27
    • 2018-03-03
    • 2017-03-17
    • 2012-10-10
    • 2017-12-29
    • 2018-08-20
    • 2012-11-25
    相关资源
    最近更新 更多