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

Java - differentiate between files in unicode NFC and NFD

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

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

所以我想我在写问题的时候找到了答案,看起来有一种方法可以获取文件名的原始规范化形式,那就是通过 Path.toUri() method. Interestingly enough the 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()));
        }
    }