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

Abe*_*bel 26 .net c# ucs2 utf-16 astral-plane

更新了问题¹

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

原始问题

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

string s = "\u1D7D9"; // ("Mathematical double-struck digit one") 
Run Code Online (Sandbox Code Playgroud)

它存储字符串"?9".

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

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

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

Jim*_*iTh 19

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

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

您可以使用大写直接处理高Unicode代码点\U- 例如"\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通过调用静态属性来获取支持的Unicode版本SortVersion.FullVersion.在同一页面上,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中所说的一致.


Joe*_*men 5

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

string text = "\U0001D7D9"

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