我尝试使用几个 Windows 文件同步程序(Microsoft SyncToy、FreeFileSync)在两个文件夹之间进行同步:一个本地 Windows 文件夹和一个使用 WebDAV 安装在 Windows 计算机上的 OS X 文件夹。但是,同步效果不太好:每当文件名使用不常见的字符(重音符号、中文字母……)时,程序都无法将其检测为同一个文件,并尝试以两种方式复制:首先从 Windows 系统复制到 OS X 系统,然后再以另一种方式复制。基本上,它将文件的 2 个副本视为完全不同的文件。
这让我开始思考:OS X 和 Windows 中文件名使用的 Unicode 到底有哪些不同?(我认为它们现在都支持 Unicode)。如何才能防止这种不兼容现象?
两台机器均使用Windows 7 SP 1和OS X 10.9.5。
答案1
Windows 使用 UTF-16。大多数代码点都用两个字节编码。BMP(基本多语言平面)之外的代码点用四个字节的“代理对”编码。Windows 不使用任何 Unicode 规范化形式来规范化文件名。
这意味着您可以拥有两个看起来相同的文件名,一个使用由单个代码点组成的预组合“é”,另一个使用常规 ASCII“e”后跟 Unicode 组合尖音符,因此有两个代码点。
OS X 使用 UTF-8。代码点使用一到五个字节进行编码。OS X 使用 Unicode NFD(规范化形式规范分解)。
这意味着当在文件名中使用诸如“é”之类的 Unicode 字符时,系统将始终将其规范化为常规 ASCII“e”,后跟 Unicode 组合尖音符,并且始终占用两个代码点。
事实上,OS X 使用 Unicode 2.1 或 3.2 版的 Unicode NFD 规范,具体取决于 OS X 的版本。
以下是一个很好的页面,涵盖了细节在 OS X / HFS+ 的文件名编码中。