OS X - 如何计算标准化文件名

问题描述 投票:0回答:3

我需要在 Windows 和 OS X 上生成的文件名之间创建映射。我知道 OS X “将所有文件名转换为分解的 Unicode”但是,“大多数卷格式不遵循这些正常形式的确切规范“

因此,使用标准 UTF8 API 将 Windows 名称转换为 NFD 并确保我拥有正确的 OS X 名称似乎并不是一件简单的事情。有没有办法确定实际的 OS X 文件名,而无需在文件系统中实际创建文件,然后扫描目录以查看实际创建的内容?

macos unicode utf-8 unicode-normalization hfs+
3个回答
3
投票

您可能正在寻找

-[NSString fileSystemRepresentation]
方法。

请注意,此任务没有通用解决方案。有效的文件名取决于您要保存的卷的文件系统。例如,并非每个对 HFS+ 有效的文件名都对 FAT32 有效。

对于 Mac 的“标准”文件系统(当前为 HFS+),

fileSystemRepresentation
应该可以满足您的需求;对于其他文件系统,没有通用的方法。想想那些不存在但将来会引入的,例如:)


3
投票

我认为答案来自TechNote 1150 HFS Plus Volume Format:

注意:Mac OS Text Encoding Converter 提供了几个常量 允许您在存储的规范分解形式之间进行转换 在 HFS Plus 卷上。使用 CreateTextEncoding 创建文本时 编码,您应该将 TextEncodingBase 设置为 kTextEncodingUnicodeV2_0,将 TextEncodingVariant 设置为 kUnicodeCanonicalDecompVariant,并将 TextEncodingFormat 设置为 kUnicode16BitFormat。使用这些值可确保 Unicode 将 与 HFS Plus 卷上的形式相同,甚至与 Unicode 相同 标准不断发展。


0
投票

根据您的链接,文件系统驱动程序似乎(大部分)遵循以下两种行为之一: * 返回 NFD 中的所有名称,并根据需要转换名称。 * 不要执行任何转换。

在这两种情况下,如果您在 OSX 上以 NFD 形式创建文件,则在 OSX 上读回该文件应该会为您提供 NFD 中的名称。

OTOH,如果您的文件名来自 Windows → NFS → Mac,并且您想要进行某种同步,那么您就不走运了。这不是一件容易的事情,因为潜在的问题有点哲学:文件名应该是字节字符串还是 Unicode 字符串?我相信 Unix 传统上是前者,至少在 Linux 中,UTF-8 NFC 名称只是一种约定

(情况会变得更糟,因为 IIRC HFS+ 被定义为使用 Unicode 3.something,因此对于从那时起添加/更改的字符,简单地转换为 NFD 可能是错误的,除非您使用的 API 可以保证特定的 Unicode 版本。)

© www.soinside.com 2019 - 2024. All rights reserved.