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()));
}
}
我有一个使用 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()));
}
}