通过Java创建Linux上的文件名编码问题

时间:2015-06-16 13:02:20

标签: java linux encoding

我遇到了问题,而且我已经坚持了很长一段时间了。问题是,我无法获取文件名来支持特殊字符(只有文件名,文件内容没问题)。而不是它们,文件名是用问号创建的。

现在,据我所知(我很可能会遗漏一些非常明显的东西),Linux本身已正确设置。 Locale命令将打印出以下内容,我认为没问题:

    LANG=en_US.UTF-8
    LC_CTYPE="en_US.UTF-8"
    LC_NUMERIC="en_US.UTF-8"
    LC_TIME="en_US.UTF-8"
    LC_COLLATE="en_US.UTF-8"
    LC_MONETARY="en_US.UTF-8"
    LC_MESSAGES="en_US.UTF-8"
    LC_PAPER="en_US.UTF-8"
    LC_NAME="en_US.UTF-8"
    LC_ADDRESS="en_US.UTF-8"
    LC_TELEPHONE="en_US.UTF-8"
    LC_MEASUREMENT="en_US.UTF-8"
    LC_IDENTIFICATION="en_US.UTF-8"
    LC_ALL=

这是我为编写测试而编写的Java代码。并非所有东西都能保持清晰(比如最终阻止),但重要的是一切。我也尝试使用BufferedOutputStream对主题进行修改,但结果是一样的。

    String exampleString="I'm in the file: \u0160 \u0161 \u010C \u010D";
    String filename="I'm the filename \u0160\u0161\u010C\u010D.txt";

    FileOutputStream fos = null;
    InputStream is = null;
    try {

        fos = new FileOutputStream(transferDir.getPath()
                + File.separator + "_"
                + filename);

        is = new ByteArrayInputStream(exampleString.getBytes(StandardCharsets.UTF_8));

        byte[] buffer = new byte[4096];
        int counter;
        while ((counter = is.read(buffer)) != -1) {
            fos.write(buffer, 0, counter);
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

我还尝试使用 file.encoding sun.jnu.encoding 属性启动该程序,但这没有任何改变。

我开始质疑真相是否真的存在,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

你在哪里可以看到文件名中的问号?可能是您尝试执行ls -l(或其他)的控制台根本没有字形来正确渲染您的异域角色。

创建此类文件后,尝试使用预期的名称和带有问号的名称打开它。您很快就会知道在创建文件期间名称本身是否真的搞砸了。

答案 1 :(得分:0)

好吧,看来这是旧版File API中的一个长期存在的错误。我已经解决了所有问题 - 没有任何额外的配置 - 切换到更新的java.nio包