Apple 的新文件系统 APFS 带来了测试文件名相等性的新规则,它们与 HFS 不同。我正在寻找正确的方法来比较两个名称是否相等,特别是对于 APFS,但为了完整性,添加一个用于 HFS+ 检查也没有什么坏处。
为什么?因为我需要能够判断我在目录中找到的文件名是否与某个模式匹配,例如包含某个子字符串。为此,我需要匹配文件系统和 Finder 用于比较名称的确切规则。
对于这些文件系统的区分大小写的变体,这很容易,因为按字节比较就足够了,我相信(假设两个字符串都使用相同的编码)。
对于不区分大小写的 HFS+,我认为甚至还有一个特殊的比较选项,但我在 NSStringCompareOptions 中找不到这样的选项。我认为这是必要的,因为 HFS+ 使用的是旧版本的 Unicode 标准。我引用了 TN1150(很遗憾,它似乎不再在 Apple 网站上提供):
Unicode 细微之处
HFS Plus 大量使用 Unicode 字符串来存储文件和文件夹名称。然而,Unicode 仍在不断发展,它在文件系统中的使用带来了许多挑战。本节描述了一些挑战,以及 HFS Plus 使用的解决方案。
重要提示:实现不得使用其本机平台实现的 Unicode 实用程序(用于分解和比较),除非这些算法等同于此处定义的 HFS Plus 算法,并且保证永远如此。这种情况很少见。平台算法倾向于随着 Unicode 标准而发展。HFS Plus 算法不能进化,因为这样的进化会使现有的 HFS Plus 卷失效。
啊,我想到了关于获得所用编码的 HFS+ 版本的部分:
注意:Mac OS 文本编码转换器提供了几个常量,可让您与存储在 HFS Plus 卷上的规范、分解形式相互转换。使用 CreateTextEncoding 创建文本编码时,应将 TextEncodingBase 设置为 kTextEncodingUnicodeV2_0,将 TextEncodingVariant 设置为 kUnicodeCanonicalDecompVariant,并将 TextEncodingFormat 设置为 kUnicode16BitFormat。使用这些值可确保 Unicode 与 HFS Plus 卷上的格式相同,即使随着 Unicode 标准的发展。
那么,正确比较 HFS+ 和 APFS 名称的现代方法是什么?