2

我有一个使用 .NET for Windows 和 Mono for Mac / OSX 的跨平台应用程序。

我的应用程序处理文件名并将序列化的数据结构写入磁盘,其中包含文件名作为字符串。其中一些文件名具有国际字符,如重音符号。

当我将在 Windows (NTFS) 上创建的数据文件复制到 Mac 时,我遇到了名称中包含这些国际重音字符的文件的一些问题。

从 NTFS 读取并由 .NET 序列化的文件名包含重音字母的单个字符,但是当我在 OSX 上使用 Mono 从文件系统读取文件名时,我得到与序列化表示不匹配的两个字符表示。我需要在 Windows 和 Mac 上保持序列化文件名和实际文件系统之间的一致性。

例如,字母 é 是在 Windows 上使用 .NET 从文件名中获取的,并被序列化为整数值为 233 的单个字符。在 OSX 上,我使用 Mono 读取复制文件的文件名,该字母用两个字符表示整数值 101 和 769,将字母和重音表示为不同的字符。问题是这种表示与在 Windows 上编写的序列化表示不匹配。

我需要找到某种方法来强制保持一致性 - 无论是在包含文件名的序列化数据结构中,还是在文件名本身中。

.NET/Mono 中是否有某种方法可以规范化这些不同的字符串表示形式?我查看了 Normalize() 方法,但我认为它没有达到我想要的效果。要么,要么我不理解文档。

NTFS 还可以存储带有重音字母的两个字符表示的文件名吗?如果是这样,它会将这两种表示视为不同的吗?我可能更喜欢对实际文件名本身进行规范化。

提前致谢!

4

1 回答 1

3

我认为问题在于 Windows 和 Mac OS X 使用不同的系统对文件名中的字符进行编码。

根据这个 SO question 的第一个答案,NTFS 使用 UTF-16 存储文件名。但是,根据这个 SO question 的第二个答案,Mac OS X 通过规范化形式 D 使用 UTF-8 存储文件名,其中字形“é”被“规范地分解”为“e”(101),并结合了锐音标记“´”(769)。

所以我担心除非你将文件名限制为纯 ASCII,否则它们在两个操作系统上只会有不同的表示。

于 2013-01-30T23:37:34.093 回答