OS X - 如何计算规范化文件名

时间:2012-10-26 15:12:09

标签: macos unicode utf-8 unicode-normalization hfs+

我需要在Windows和OS X上生成的文件名之间创建一个映射。我知道OS X "converts all file names to decomposed Unicode"但是"most volume formats do not follow the exact specification for these normal forms"

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

3 个答案:

答案 0 :(得分:3)

我认为answer来自TechNote 1150 HFS Plus卷格式:

  

注意:Mac OS文本编码转换器提供了几个常量   允许您转换为存储的规范分解形式   在HFS Plus卷上。使用CreateTextEncoding创建文本时   编码,你应该将TextEncodingBase设置为   kTextEncodingUnicodeV2_0,将TextEncodingVariant设置为   kUnicodeCanonicalDecompVariant,并将TextEncodingFormat设置为   kUnicode16BitFormat。使用这些值可确保Unicode   与HFS Plus卷上的格式相同,即使是Unicode   标准演变。

答案 1 :(得分:3)

您可能正在寻找-[NSString fileSystemRepresentation]方法。

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

对于Mac的“标准”文件系统(目前为HFS +),fileSystemRepresentation应该提供您需要的内容;对于其他文件系统,没有一般方法。想想那些不存在但将来会被引入的,例如:)

答案 2 :(得分:0)

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

在这两种情况下,如果你在NFD上的OSX上创建一个文件,在OSX上读回它应该会给你NFD中的名字。

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

(情况变得更糟,因为IIRC HFS +被定义为使用Unicode 3.something,所以从那时起添加/更改字符的天真转换可能是错误的,除非您使用的API可以保证特定的Unicode版本。)< / p>