【问题标题】:How can I canonicalize diacritic string representation between .NET and Mono OSX?如何规范化 .NET 和 Mono OSX 之间的变音符号字符串表示?
【发布时间】:2013-01-30 22:16:13
【问题描述】:

我有一个使用 .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 也可以存储带有重音字母的两个字符表示的文件名吗?如果是这样,它会将这两种表示视为不同的吗?我可能更喜欢自己对实际文件名进行规范化。

提前致谢!

【问题讨论】:

  • 这实际上是 String.Normalize() 所做的。
  • String.Normalize() 为我解决了类似的问题。

标签: .net macos unicode mono diacritics


【解决方案1】:

我认为问题在于 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,否则它们在两个操作系统上只会有不同的表示形式。

【讨论】:

  • 顺便说一句,我以为我对 Unicode 了解很多,但在回答这个问题时才了解这个“规范分解”业务。生活和学习!
猜你喜欢
  • 2014-08-24
  • 2010-09-19
  • 1970-01-01
  • 2012-02-07
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多