我需要在 Windows 和 OS X 上生成的文件名之间创建映射。我知道 OS X “将所有文件名转换为分解的 Unicode”,但是“大多数卷格式不遵循这些正常形式的确切规范”
因此,使用标准 UTF8 API 将 Windows 名称转换为 NFD 并确保我拥有正确的 OS X 名称似乎不是一件简单的事情。有没有办法确定实际的 OS X 文件名,而无需在文件系统中实际创建文件,然后扫描目录以查看实际创建的内容?
我需要在 Windows 和 OS X 上生成的文件名之间创建映射。我知道 OS X “将所有文件名转换为分解的 Unicode”,但是“大多数卷格式不遵循这些正常形式的确切规范”
因此,使用标准 UTF8 API 将 Windows 名称转换为 NFD 并确保我拥有正确的 OS X 名称似乎不是一件简单的事情。有没有办法确定实际的 OS X 文件名,而无需在文件系统中实际创建文件,然后扫描目录以查看实际创建的内容?
我认为答案来自 TechNote 1150 HFS Plus Volume Format:
注意:Mac OS 文本编码转换器提供了几个常量,可让您与存储在 HFS Plus 卷上的规范、分解形式相互转换。使用 CreateTextEncoding 创建文本编码时,应将 TextEncodingBase 设置为 kTextEncodingUnicodeV2_0,将 TextEncodingVariant 设置为 kUnicodeCanonicalDecompVariant,并将 TextEncodingFormat 设置为 kUnicode16BitFormat。使用这些值可确保 Unicode 与 HFS Plus 卷上的格式相同,即使随着 Unicode 标准的发展。
您可能正在寻找-[NSString fileSystemRepresentation]
方法。
请注意,此任务没有通用解决方案。什么是有效文件名取决于您要保存的卷的文件系统。例如,并非对 HFS+ 有效的每个文件名都对 FAT32 有效。
对于 Mac 的“标准”文件系统(目前是 HFS+),fileSystemRepresentation
应该可以满足您的需求;对于其他文件系统,没有通用的方法。想想那些不存在但将来会引入的,例如:)
根据您的链接,文件系统驱动程序似乎(主要)遵循以下两种行为之一:*返回 NFD 中的所有名称,并根据需要转换名称。* 不要执行任何转换。
在这两种情况下,如果您在 NFD 中的 OSX 上创建文件,则在 OSX 上读取它应该会在 NFD 中为您提供名称。
OTOH,如果您的文件名来自 Windows → NFS → Mac 并且您想要进行某种同步,那么您就不走运了。这不是一件容易的事,因为潜在的问题有点哲学性:文件名应该是字节字符串还是 Unicode 字符串?我相信 Unix 传统上是前者,至少在 Linux 中,UTF-8 NFC 名称只是一种约定。
(情况变得更糟,因为 IIRC HFS+ 被定义为使用 Unicode 3.something,因此对于从那时起添加/更改的字符,天真转换为 NFD 可能是错误的,除非您使用的 API 可以保证特定的 Unicode 版本。)