在内部,.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
。在同一页上,微软解释说 .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中所说的一致。