如何在.NET和Mono OSX之间规范化变音字符串表示?

时间:2013-01-30 22:16:13

标签: .net macos unicode mono diacritics

我有一个跨平台应用程序,使用.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还可以存储带有重音字母的两个字符表示的文件名吗?如果是这样,它会将这两种表述视为不同吗?我可能更愿意对实际的文件名本身进行规范化。

我提前感谢!

1 个答案:

答案 0 :(得分:3)

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

根据the first answer to this SO question,NTFS使用UTF-16存储文件名。但是,根据the second answer to this SO question,Mac OS X通过规范化形式D使用UTF-8存储文件名,其中字形“é”被“规范地分解”为“e”(101)和组合的尖锐重音标记“ '“(769)。

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