我需要在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文件名是什么,而无需在文件系统中实际创建文件,然后扫描目录以查看实际创建的内容?
答案 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>