Java - 区分unicode NFC和NFD中的文件

时间:2017-04-12 22:02:39

标签: java unicode filesystems unicode-normalization

我有一个由Fuse for MacOS制作的云支持文件系统。显然,此文件系统将使用不同unicode规范化表单的文件视为不同的文件。因此,您可以在NFC中拥有一个文件,在NFD中拥有另一个具有相同名称的文件。

所以我的问题是,是否可以将这两个文件名作为两个不同的字符串从Java中读取?导致File.getName()File.getPath()Path.getFileName()等似乎返回两个文件的NFC规范化字符串,因此将它们视为相等。

1 个答案:

答案 0 :(得分:1)

所以我认为我在撰写问题时找到了答案,看起来有一种方法可以将文件名设置为原始的规范化形式,即通过Path.toUri()方法。有趣的是,File.toURI()并没有做同样的事情。

这是一个有效的例子:

    Files.list(Paths.get("/path/to/my/folder"))
            .filter(Files::isRegularFile)
            .forEach((f) -> System.out.println(org.apache.commons.codec.binary.Hex.encodeHex(f.toUri().getPath().getBytes())));

这是一个没有:

    File folder = new File("/path/to/my/folder");
    File[] listOfFiles = folder.listFiles();
    for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].isFile()) {
            System.out.println(org.apache.commons.codec.binary.Hex.encodeHex(listOfFiles[i].toURI().getPath().getBytes()));
        }
    }