哪个.NET平台以及哪个版本的Windows在字符类方面支持哪个版本的Unicode?

更新了问题¹

关于字符类,比较,排序,规范化和排序规则,哪些.NET平台支持哪些Unicode版本?

原始问题

我记得有些模糊地读过.NET支持Unicode 3.0版,内部UTF-16编码不是真正的UTF-16,但实际上使用的是UCS-2,这是不一样的。 例如,似乎U + FFFF以上的字符是不可能的,即考虑:

string s = "\u1D7D9"; // ("Mathematical double-struck digit one") 

它存储字符串"ᵽ9"

我基本上是在寻找以下答案的确切参考:

  • 如果在.NET中不是真正的UTF-16,它是什么?
  • .NET支持哪个版本的Unicode?
  • 如果在不久的将来不支持或计划最新版本,是否有人知道(非)商业库或我如何解决此问题?

¹)我随着时间的推移更新了问题,对于答案和更大的社区来说似乎更合适。 我留下原来的问题来代替评论中回答了哪些部分。 在现有的32位Windows版本中也使用了旧的UCS-2(没有代理),.NET一直在内部使用UTF-16(带有代理)。

在内部,.NET是UTF-16。 在某些情况下,例如,当ASP.NET写入响应时,默认情况下它使用UTF-8。 他们两个都可以处理更高的飞机。

人们有时将.NET称为UCS2的原因是(我认为 ,因为我看到其他一些原因)Char严格为16位,而单个Char不能用于表示高层平面。 但是,Char确实具有静态方法重载(例如Char.IsLetter ),它可以在字符串内的高平面UTF-16字符上操作。 字符串存储为真正的UTF-16。

您可以直接使用大写\U来解决高Unicode代码点 – 例如"\U0001D7D9" – 但同样,只能在字符串内部而不是字符。

至于Unicode版本, 来自MSDN文档 :

“在.NET Framework 4中,排序,大小写,规范化和Unicode字符信息与Windows 7同步,并符合Unicode 5.1标准 。”

更新1:但值得注意的是,这并不意味着支持整个 Unicode 5.1 – 在Windows 7和.NET 4.0中都不支持

Windows 8的目标是Unicode 6.0 – 我猜测.NET Framework 4.5可能与之同步,但没有找到确认它的消息来源。 再一次,这并不意味着整个标准得以实施。

更新2: 关于Roslyn的这一说明证实了底层平台定义了对编译器的Unicode支持,并且在代码链接中,它解释了C#6.0支持Unicode 6.0及更高版本(结果是C#标识符发生了重大变化)。

更新3:从.NET 4.5版SortVersion ,引入了一个新类SortVersion通过调用静态属性SortVersion.FullVersion来获取受支持的Unicode版本。 在同一页面上 ,Microsoft解释说.NET 4.0在所有平台上都支持Unicode 5.0,而.NET 4.5在Windows 7上支持Unicode 5.0,在Windows 8上支持Unicode 6.0。这与这里的官方“新内容”声明略有不同。分别是5.x和6.0版本。 从我自己的(编辑:Abel)经验来看,在大多数情况下,似乎在.NET 4.0中,Unicode 5.1至少支持字符类,但我没有测试排序,规范化和排序规则。 这似乎与上面引用的MSDN中所说的一致。

该角色受到支持。 需要注意的一点是,对于超过2个字节的unicode字符,必须用大写的’\ U’声明它们,如下所示:

string text = "\U0001D7D9"

如果您在文本块中创建具有该字符的WPF应用程序,它应该完美地呈现双重字符。

MSDN简要介绍了这里: http : //msdn.microsoft.com/en-us/library/9b1s4yhz(v = vs。90).aspx

我试过这个:

  static void Main(string[] args) { string someText = char.ConvertFromUtf32(0x1D7D9); using (var stream = new MemoryStream()) { using (var writer = new StreamWriter(stream, Encoding.UTF32)) { writer.Write(someText); writer.Flush(); } var bytes = stream.ToArray(); foreach (var oneByte in bytes) { Console.WriteLine(oneByte.ToString("x")); } } } 

并获得了一个包含正确BOM的字节数组的转储以及\ u1D7D9代码点的正确表示,用于这些编码:

  • UTF8
  • UTF32
  • Unicode (UTF-16)

所以我的猜测是支持更高的平面,UTF-16真的是UTF-16 (而不是UCS-2)

.NET Framework 4.6和4.5以及4和3.5和3.0 – Unicode标准版本5.0 .NET Framework 2.0和1.1 – Unicode标准版本3.1

完整的答案可以在备注部分找到。