我需要建立在Windows上生成的文件名和OS X.之间的映射我知道OS X “的所有文件名转换为Unicode的分解”然而, “最容量格式不遵循这些正常的形式确切的规格”
因此,它似乎并没有使用标准的API UTF8 Windows名称转换为NFD并且是确保我有正确的OS X的名字一件简单的事情。 有没有一种方法来确定实际的OS X的文件名是什么,而不实际创建的文件系统中的文件,然后扫描目录,看看有什么实际创建?
我需要建立在Windows上生成的文件名和OS X.之间的映射我知道OS X “的所有文件名转换为Unicode的分解”然而, “最容量格式不遵循这些正常的形式确切的规格”
因此,它似乎并没有使用标准的API UTF8 Windows名称转换为NFD并且是确保我有正确的OS X的名字一件简单的事情。 有没有一种方法来确定实际的OS X的文件名是什么,而不实际创建的文件系统中的文件,然后扫描目录,看看有什么实际创建?
我想答案是这样的,从技术说明1150 HFS Plus宗卷格式:
注:Mac OS的文本编码转换器提供了几个常数,让你转换,并从存储在HFS加量规范,分解形式。 当使用CreateTextEncoding创建一个文本编码,应该将TextEncodingBase设置为kTextEncodingUnicodeV2_0,设置TextEncodingVariant到kUnicodeCanonicalDecompVariant,并设置TextEncodingFormat到kUnicode16BitFormat。 使用这些值确保了的Unicode将在相同的形式作为HFS加上卷上,即使在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可能是错误的字符添加/从那以后改变,除非你使用可以保证特定的Unicode版本的API。)