在字符类方面,哪个.NET平台和哪个版本的Windows支持哪个版本的Unicode

本文关键字:版本 Windows Unicode 支持 平台 字符 方面 NET 哪个 | 更新日期: 2023-09-27 18:23:44

更新的问题

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

原始问题

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

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

并且它存储字符串CCD_ 1。

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

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

我更新了这个问题,因为随着时间的推移,它似乎更适合答案和更大的社区。我把原来的问题留在了评论中回答了哪些部分。此外,旧的UCS-2(没有代理)在现在古老的32位Windows版本中使用,.NET在内部一直使用UTF-16(有代理)。

在字符类方面,哪个.NET平台和哪个版本的Windows支持哪个版本的Unicode

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

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

您可以直接使用大写的'U(例如"'U0001D7D9")来寻址高Unicode代码点,但同样,只能在字符串中,而不能在字符中。

至于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.FullVersion来获得支持的Unicode版本。在同一页上,微软解释说,.NET 4.0在所有平台上都支持Unicode 5.0,.NET 4.5在Windows 7上支持Unicode 5.0和在Windows 8上支持Unicode 6.0。这与这里的官方"what is new"声明略有不同,后者分别谈到了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版

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