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".
我基本上是在寻找以下答案的确切参考:
¹)我随着时间的推移更新了问题,对于答案和更大的社区来说似乎更合适.我留下原来的问题来代替评论中回答了哪些部分.在现有的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中所说的一致.
该角色受到支持.需要注意的一点是,对于超过2个字节的unicode字符,必须用大写的'\ U'声明它们,如下所示:
string text = "\U0001D7D9"
如果您在文本块中创建具有该字符的WPF应用程序,它应该完美地呈现双重字符.